第一节 提出问题与解决方案核心代码
1、提出问题
保持用户登录状态,背后的底层逻辑是:服务器在接收到用户请求的时候,有办法判断这个请求来自于之前的某一个用户。所以保持登录状态,本质上是保持『会话状态』
2、解决方案
①结论
使用HttpSession对象,将数据存入会话域就能保持会话状态。
1. HttpSession session = request.getSession(); 2. session.setAttribute("user", user);
②demo体验
1]准备环境
参考会话控制demo原始纯净版
[2]创建将数据存入会话域的Servlet
1. public class HelloWorldServlet extends ModelBaseServlet { 2. protected void setValue(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. 4. // 1.通过request对象获取session对象 5. HttpSession session = request.getSession(); 6. 7. // 2.设置数据名称和数据的值 8. String attrName = "sessionHelloAttrName"; 9. String attrValue = "sessionHelloAttrValue"; 10. 11. // 3.将数据存入会话域 12. session.setAttribute(attrName, attrValue); 13. 14. // 4.渲染视图 15. processTemplate("page-target", request, response); 16. } 17. }
[3]在其他页面从会话域取出数据
1. <div th:if="${#strings.isEmpty(session.sessionHelloAttrName)}"> 2. 没有从会话域获取到数据 3. </div> 4. <div th:if="${not #strings.isEmpty(session.sessionHelloAttrName)}"> 5. <p>从会话域读取到:<span th:text="${session.sessionHelloAttrName}"></span></p> 6. </div>
[4]操作效果
第二节 Cookie的工作机制
1、HTTP协议和会话控制
HTTP协议本身是无状态的。单靠HTTP协议本身无法判断一个请求来自于哪一个浏览器,所以也就没法识别用户的身份状态。
2、Cookie介绍
①本质
- 在浏览器端临时存储数据
- 键值对
- 键和值都是字符串类型
- 数据量很小
②Cookie在浏览器和服务器之间的传递
[1]没有Cookie的状态
在服务器端没有创建Cookie并返回的情况下,浏览器端不会保存Cookie信息。双方在请求和响应的过程中也不会携带Cookie的数据。
[2]创建Cookie对象并返回
1. // 1.创建Cookie对象 2. Cookie cookie = new Cookie("cookie-message", "hello-cookie"); 3. 4. // 2.将Cookie对象添加到响应中 5. response.addCookie(cookie); 6. 7. // 3.返回响应 8. processTemplate("page-target", request, response);
[3]服务器端返回Cookie的响应消息头
[4]浏览器拿到Cookie之后
浏览器拿到Cookie之后,以后的每一个请求都会携带Cookie信息。
[5]服务器端读取Cookie的信息
1. // 1.通过request对象获取Cookie的数组 2. Cookie[] cookies = request.getCookies(); 3. 4. // 2.遍历数组 5. for (Cookie cookie : cookies) { 6. System.out.println("cookie.getName() = " + cookie.getName()); 7. System.out.println("cookie.getValue() = " + cookie.getValue()); 8. System.out.println(); 9. }
③Cookie时效性
[1]理论
- 会话级Cookie
- 服务器端并没有明确指定Cookie的存在时间
- 在浏览器端,Cookie数据存在于内存中
- 只要浏览器还开着,Cookie数据就一直都在
- 浏览器关闭,内存中的Cookie数据就会被释放
- 持久化Cookie
- 服务器端明确设置了Cookie的存在时间
- 在浏览器端,Cookie数据会被保存到硬盘上
- Cookie在硬盘上存在的时间根据服务器端限定的时间来管控,不受浏览器关闭的影响
- 持久化Cookie到达了预设的时间会被释放
服务器端返回Cookie时附带过期时间的响应消息头如下:
服务器通知浏览器删除Cookie时的响应消息头如下:
[2]代码
1. // ※给Cookie设置过期时间 2. // 正数:Cookie的过期时间,以秒为单位 3. // 负数:表示这个Cookie是会话级的Cookie,浏览器关闭时释放 4. // 0:通知浏览器立即删除这个Cookie 5. cookie.setMaxAge(20);
[3]会话和持久化Cookie对比
④Cookie的domain和path
上网时间长了,本地会保存很多Cookie。对浏览器来说,访问互联网资源时不能每次都把所有Cookie带上。浏览器会使用Cookie的domain和path属性值来和当前访问的地址进行比较,从而决定是否携带这个Cookie。