一、Cookie
Http是一种无状态协议, 既上一次的请求和这一次的请求没有关联。在不同请求间无法进行数据传递,我们可以使用cookie进行客户端会话跟踪。
1、使用场景:
用于在页面登录中记住我/Remember me/多少天内免登陆、购物车添加物品等。
2、工作原理:
(1) 用户提交第一次请求时,由服务器生成cookie,并封装到响应头中,
将响应头【Set-Cookie:Key=Value】发给客户端
//创建cookie
Cookie cookie=new Cookie(key,value);
//向响应中添加cookie
response.addCookie(cookie);
(2) 客户端接收到响应后,将Set-Cookie中的数据全部保存在磁盘上。
(3) 当客户端再次发送请求后,在请求中会携带客户端的Cookie数据,发送到服务端,由服务器进行会话跟踪。
3、相关API
(1) 设置cookie有效日期。
//以秒为单位。设置cookie有效期1小时,参数值>0,将cookie存放到客户端磁盘上。
cookie.setMaxAge(60*60);
//参数值=0,表示cookie一生成,马上失效。
cookie.setMaxAge(0);
//参数值<0,与不设置效果相同,会将cookie放入浏览器缓存中。
cookie.setMaxAge(-1);
(2) 设置路径
//request.getContextPath()获取项目部署名,/aaa为服务路径
cookie.setPath(request.getContextPath()+"/aaa");
二、Session
什么是会话呢?
当用户打开浏览器,从发出第一次请求开始,一直到最终关闭浏览器,就表示一次会话的完成。
1、使用场景:
访问敏感url时,使用session可以校验用户信息。
2、工作原理:
Session结构:Map < SessionID,Session>
(1) 用户第一次提交请求时,服务端Servlet执行request.getSession()方法,
会自动生成一个Map.Entry()对象,key为32位字符串的SessionID;Value为Session对象。
//create为true,有session就使用当前session,没有的话新建一个session。
//create为false,有session就使用当前session,没有的话返回null。
request.getSession(boolean create);
//有session就使用当前session,没有的话新建一个session。
//用法和request.getSession(true);相同
request.getSession();
Session列表
(2) 服务器把32为长度的随机字符串包装为cookie,发给客户端浏览器。其中cookie的name为SessionID,value为32为长度的字符串。
(3)浏览器接收到cookie后,保存到客户端浏览器中。
(4)客户端再次发起请求时,浏览器会把SessionID放到请求头信息中,发给服务器,服务器收到cookie后,通过key,找到value,既32为长度的字符串。在服务端Session列表中进行查找,通过字符串,找到的session。