• Session会话追踪的实现机制


            HTTP协议是一个无状态协议,即Web应用程序无法区分收到的两个HTTP请求是否是同一个浏览器发出的。为了跟踪用户状态,服务器可以向浏览器分配一个唯一ID,并以Cookie的形式发送到浏览器,浏览器在后续访问时总是附带此Cookie,这样,服务器就可以识别用户身份。

    什么是会话跟踪技术?

            会话就是客户端与服务器之间的一次交互,在一次交互中可能会包含多次请求和响应。在JavaWeb中,从客户端向服务器发出第一个请求开始,会话就开始了,直到客户端关闭浏览器会话结束。在一个会话的多个请求中共享数据,这就是会话跟踪技术。

    Session


            Session是指使用HttpSession对象实现会话跟踪的技术,是一种在服务器端保持会话跟踪的解决方案。HttpSession对象是javax.servlet.http.HttpSession接口的实例,也称为会话对象。
            HttpSession对象会在用户第一次访问服务器时由容器创建(注意只有访问JSP、Servlet等程序时才会创建,只访问HTML、IMAGE等静态资源并不会创建),当用户调用其失效方法(invalidate()方法)或超过其最大不活动时间时会失效。在此期间,用户与服务器之间的多次请求都属于同一个会话。

    代码示例:

    1. package com.my.web.servlet;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.HttpServlet;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletResponse;
    8. import javax.servlet.http.HttpSession;
    9. @WebServlet("/test.do")
    10. public class TestServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. System.out.println("大胆,我被请求到了!");
    14. // 第一次在访问session时,服务器会创建session
    15. // 并根据Session_id,创建一个名称为JSESSIONID的Cookie,将Session_id保存至Cookie
    16. // 将该Cookie响应回至浏览器客户端保存
    17. // 接下来的每次发起请求时,客户端浏览器都会在请求头中 添加 JSESSIONID
    18. HttpSession session = req.getSession();
    19. System.out.println(session.getId());
    20. }
    21. }

    浏览器中查看:

     控制台查看:

              通过请求路径在浏览器向服务器发起两次请求,可以看到两次请求的会话ID都一样,属于同一个会话。

    注意:第一次在访问session时(即req.getSession()),服务器才会创建session。

    Cookie

            cookie英⽂意思是甜点的意思,我们可以在Web应⽤程序中可以使⽤cookie在客户端保持HTTP状态信息。cookie相当于是web服务器送给客户端浏览器的甜点。⾄于什么时候送,送什么样的甜点,有效期是多常时间,完全由服务器来决定。
          Cookie在HTTP中通常是用来辨别用户身份,进行会话跟踪而储存在用户本地终端上的数据,一般会加密处理,由用户客户端计算机暂时或永久保存的信息。其结构就是一个键和一个值构成的。随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。

    Cookie的用法:

            在Javaweb中可以基于servlet创建Cookie,设置属性

    代码示例:

    1. package com.my.web.servlet;
    2. import java.io.IOException;
    3. import javax.servlet.ServletException;
    4. import javax.servlet.annotation.WebServlet;
    5. import javax.servlet.http.Cookie;
    6. import javax.servlet.http.HttpServlet;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. @WebServlet("/getcookie.do")
    10. public class TestGetCookieServlet extends HttpServlet {
    11. @Override
    12. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    13. // 创建Cookie对象
    14. Cookie cookie1 = new Cookie("phone_number", "15129802903");
    15. Cookie cookie2 = new Cookie("name", "pig");
    16. Cookie cookie3 = new Cookie("age", "15");
    17. // 设置Cookie的过期时间,默认跟Session的一致
    18. cookie1.setMaxAge(60 * 60 * 24 * 7);//7天
    19. cookie2.setMaxAge(60 * 60 * 24 * 20);//20天
    20. // 响应
    21. resp.addCookie(cookie1);// 将Cookie添加至响应头
    22. resp.addCookie(cookie2);// 将Cookie添加至响应头
    23. resp.addCookie(cookie3);// 将Cookie添加至响应头
    24. }
    25. }

    可在浏览器查看:

     

    总结

    • Cookie是把用户的数据写给用户的浏览器。
    • Session技术把用户的数据写到用户独占的Session中。

            服务器在创建会话对象时,会为其分配一个唯一的会话标识——SessionId,以“JSESSIONID”的属性名保存在客户端Cookie中,在用户随后的请求中,服务器通过读取Cookie中的JSESSIONID属性值来识别不同的用户,从而实现对每个用户的会话跟踪。

  • 相关阅读:
    如何验证命令执行漏洞(无回显)
    elasticsearch基本操作
    Rt-Thread 移植3--临界段保护(KF32)
    【1314. 矩阵区域和】
    node + sqlite + Sequelize (ORM:Object-Relational Mapping对象关系映射)
    微服务不是软件工程银弹的10个原因
    Mac电脑音视频播放器: Infuse for Mac中文
    【DropBlock】《DropBlock:A regularization method for convolutional networks》
    研发挑战的解决之道
    第五十九回 公孙胜芒砀山降魔 晁天王曾头市中箭-飞桨自然语言处理套件PaddleNLP初探
  • 原文地址:https://blog.csdn.net/qq_52223733/article/details/126504431