会话:用户打开一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话;
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
你怎么证明你是保定学院的学生
你 保院
1.学费发票 保院给你发票
2.学习登记 保院标记你来过了
一个网站,怎么证明你来过?
客户端 服务端
1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie
2.服务端等你你来过了,下次你来的时候我来匹配你;session
拓展:
http是一个无状态的协议
什么是无状态:就是说这次请求和上一次请求没有任何关系,互不认识,这种无状态的好处是快速。
坏处是假如我们想要把www.zhihu.com/login.html
和www.zhihu.com/index.html
关联起来,必须使用某些手段和工具
cookie
- 客户端技术(响应,请求)
session
- 服务端技术,利用这个技术,我们可以保存用户的会话信息,我们可以把这些信息放在session中。
常见场景:
- 网站登录之后,你下次就不用登录了,第二次访问就直接上去了
1.从请求中拿到cookie信息
2.服务器响应给客户端cookie
Cookie[] cookies = req.getCookies();//获取cookie
cookie.getName();//获取cookie中的key
cookie.getValue();//获取cookie中的value
Cookie cookie = new Cookie("lastLoginTime", "" + System.currentTimeMillis());//新建一个cookie
cookie.setMaxAge(24*60*60);//设置cookie的有效期
resp.addCookie(cookie);//响应给客户端一个cookie
cookie:一般会保存在本地的用户目录下的/AppData下
一个网站的Cookie是否存在上限?
-
一个cookie只能保存一个信息
-
一个web站点可以给浏览器发送多个cookie,每个web站点最多存放20个cookie(不同浏览器会有所不同)
-
cookie的大小有限制4kb
-
浏览器上限是300个cookie
删除cookie
-
不设置有效期,关闭浏览器,自动失效
-
设置有效时间为0
新建一个项目
pom.xml
4.0.0
com.kuang
javaweb-session-cookie
1.0-SNAPSHOT
war
javax.servlet
servlet-api
2.5
javax.servlet.jsp
jsp-api
2.1
web.xml
CookieDemo01
com.kuang.servlet.CookieDemo01
CookieDemo01
/c1
CookieDemo02
com.kuang.servlet.CookieDemo02
CookieDemo02
/c2
CookieDemo03
com.kuang.servlet.CookieDemo03
CookieDemo03
/c3
CookieDemo01.java
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies();//这里返回的是数组,说明Cookie可能有多个
//判断cookie是否存在
if (cookies != null){
//如果存在
out.write("您上一次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("lastLoginTime")){
//获取cookie中的值
Long lastLoginTime = Long.parseLong(cookie.getValue());
Date date = new Date(lastLoginTime);
out.write(date.toLocaleString());
}
}
}else {
out.write("这是您第一次访问本站");
}
//服务器给客户端响应一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
cookie.setMaxAge(24*60*60);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
CookieDemo02.java
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建一个cookie,名字必须要和被删除的创建一个cookie名称相同
Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
//将cookie有效期设置为0,立马过期
cookie.setMaxAge(0);
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
lastLoginTime Cookie实失效,再去访问http://localhost:8080/c/chttp://localhost:8080/c/c1
就会变成第一次访问的效果
CookieDemo03.java
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Date;
public class CookieDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决中文乱码
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
//Cookie,服务器从客户端获取
Cookie[] cookies = req.getCookies();//这里返回的是数组,说明Cookie可能有多个
//判断cookie是否存在
if (cookies != null){
//如果存在
out.write("您上一次访问的时间是:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
//获取cookie的名字
if (cookie.getName().equals("name")){
//解码
out.write(URLDecoder.decode(cookie.getValue(),"utf-8"));
}
}
}else {
out.write("这是您第一次访问本站");
}
//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("高壮壮","utf-8"));
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)