• Session会话追踪的实现机制


    1.Session机制(用唯一ID来识别用户)

              在Web应用程序中,我们经常要跟踪用户身份。例如:当一个用户登录成功后,如果他继续访问其他页面,Web程序如何才能识别出该用户身份?当一个用户在操作自己的购物车时,Web程序如何才能识别出该用户身份?

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

              我们把这种基于唯一ID识别用户身份的机制称为Session。每个用户第一次访问服务器后,会自动获得一个Session ID

    2.获取Session

        要想追踪session会话,我们必须首先获取到session。JavaEE的servlet机制内建了对session的支持,当我们需要获取Session时,可以通过request请求对象的getRequestedSessionId()方法。

    1. @WebServlet
    2. public class GetSession extends HttpServlet{
    3. @Override
    4. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    5. //获取到的sessionID为String的字符串类型
    6. String session = request.getRequestedSessionId();
    7. System.out.println("获取本次sessionID" + session);
    8. }

    4.Cookie(JESSIONID)

          默认的Session机制是以Cookie形式实现的

          实际上,Servlet提供的HttpSession本质上就是通过一个名为JESSIONIDcookie来跟踪用户会话的。除了这个名称外,其他名称的Cookie我们可以任意使用。

            创建一个新Cookie时,除了指定名称和值以外,通常需要设置setPath("/"),浏览器根据此前缀决定是否发送Cookie。如果一个Cookie调用了setPath("/user/"),那么浏览器只有在请求以/user/开头的路径时才会附加此Cookie。通过setMaxAge()设置Cookie的有效期,单位为秒,最后通过resp.addCookie()把它添加到响应。

                通过创建Cookie,我们可以实现在客户端浏览器中存储数据的目的,例如保存用户名和密码。在Chrome浏览器中,单个 Cookie的长度不能超过 4069 个字符(包括 name,但不包括 = 号)。

    如果我们想要读取一个Cookie,例如,在IndexServlet中,读取名为langCookie以获取用户设置的语言,可以写一个方法如下:

    1. private String parseLanguageFromCookie(HttpServletRequest req) {
    2. // 获取请求附带的所有Cookie:
    3. Cookie[] cookies = req.getCookies();
    4. // 如果获取到Cookie:
    5. if (cookies != null) {
    6. // 循环每个Cookie:
    7. for (Cookie cookie : cookies) {
    8. // 如果Cookie名称为lang:
    9. if (cookie.getName().equals("lang")) {
    10. // 返回Cookie的值:
    11. return cookie.getValue();
    12. }
    13. }
    14. }
    15. // 返回默认值:
    16. return "en";
    17. }

    4.HTTPSessionListener监听器

           当我们产生一个Session会话时,使用HTTPSessionListener监听器,就可以监听会话的开始与销毁,同样也可以获取该会话的JESSIONID。只需要调用该会话的getID()方法,具体的代码示例如下:

    @WebListener
    public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener {   
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            HttpSession currentSession = se.getSession();
            System.out.println("新的会话:"+currentSession.getId());

    }

    }

        

    5.Cookie和Session的区别

    (1)存储位置不同,Session存在服务器端,cookie存在客户端。
    (2)可保存的内容不同,Session可以保存任意对象,Cookie只能保存字符串。
    (3)生命周期不同,Session会随着会话的关闭而消失,而Cookie可以长期保存在本           地。

  • 相关阅读:
    [Linux]----文件操作(复习C语言+文件描述符)
    GBASE 8s 索引B+树
    基础数学知识
    举例说明用 easylanguage 语言,编写抄底公式
    Unix/C/C++进阶--pthread 跨平台
    贝叶斯分类(朴素)
    奖学金答辩注意事项
    《Python进阶系列》十一:集合(set and frozenset)语法汇总
    C++多线程
    深度学习应用篇-计算机视觉-图像分类[2]:LeNet、AlexNet、VGG、GoogleNet、DarkNet模型结构、实现、模型特点详细介绍
  • 原文地址:https://blog.csdn.net/weixin_54535063/article/details/126510471