《Session会话追踪的实现机制》

1 .什么是session

我们把这种基于唯一ID识别用户身份的机制称为Session。每个用户第一次访问服务器后,会自动获得一个Session ID。如果用户在一段时间内没有访问服务器,那么Session会自动失效,下次即使带着上次分配的Session ID访问,服务器也认为这是一个新用户,会分配新的Session ID。一次Session会话中往往包含着若干次request请求。

1.2 一个session从开始到结束

1.当服务器启动后,session并没有第一时间创建出来,可以通过运行以下代码发现控制台并没输出sessionID

代码:

@WebServlet("/test_session.do")
public class TestSessionServlet extends HttpServlet{
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("GET请求:TestSessionServlet被请求到了");
        // 获取session,和sessionID
        HttpSession session = req.getSession();
        System.out.println("sessionId:" + session.getId());
        
        // 创建Cookie
        Cookie cookie1 = new Cookie("phone", "13365843941");
        Cookie cookie2 = new Cookie("name", "张三");
        Cookie cookie3 = new Cookie("mail", "123456@126.com");
        
        cookie1.setMaxAge(60*60); // 单位是" 秒 "
        cookie2.setMaxAge(60*60); // 单位是" 秒 "
        cookie3.setMaxAge(60*60); // 单位是" 秒 "
        
        resp.addCookie(cookie1);
        resp.addCookie(cookie2);
        resp.addCookie(cookie3);
        
        resp.sendRedirect("test_get_cookie_value.do");
    }
}
​
@WebServlet("/test_get_cookie_value.do")
public class TestGetCookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("测试获取Cookie");
// 获取该客户端浏览器本次请求头(Request Header)中的所有的Cookie
        Cookie[] cookieArray = req.getCookies();
        
        if (cookieArray != null) {
            for (Cookie ck : cookieArray) {
                System.out.println("键:" + ck.getName());
                System.out.println("值:" + ck.getValue());
                System.out.println();
            }
        }
​
    }
}

2.当用户第一次访问服务器,会创建一个Session会话,执行结果如下图

Tomcat会自动生成一段随机sessionId存储在Cookie中,这将是一个session会话的唯一标识

3.当我们再次发出请求,他们的SessionID并没有改变,证明属于同一次会话

4.当我们关闭浏览器,重新开始发起请求时,发现sessionId发生改变,说明上一次会话已经销毁,并产生了一次新的会话

1.3 session什么时候创建,什么时候销毁

1.3.1 创建条件

1.当客户端第一次向服务器发起请求的时候生成一个session

2.当浏览器关闭,重新发起请求时也会生成一个session

1.3.2 销毁条件

1.当服务器重启或者关闭

2.当客户端浏览器关闭,属于当次会话的session 关闭

3.调用session.invalidate();方法,也会使session销毁

1.4 不同的session的区别

1.不同的session的sessionId不同,一个session有唯一的一个sessionID做唯一标识

1.5 小结

1.5.1 原理:

  • 客户端浏览器第一次访问,服务器端创建一个会话对象。并且具有id的唯一值。 依赖cookie将sessionId的值发送给客户端。

  • 第二次请求的时候,客户端浏览器携带sessionId到服务器。服务器端获得sessionId, 从而实现了会话跟踪:

  • 特点:创建在服务器端,并且保存在服务器端

1.5.2 Cookie

  • Cookie 也是一个容器

  • Cookie相当于一张会员卡,他属于浏览器端,里面存储着一些键值对信息,

  • 每当发起请求时,就会在这张“会员卡”中比对信息,如果这次请求有sessionID信息,则不会新创建

  • 而如果这次请求时第一次发起,浏览器端发现没有这次请求的sessionID信息,则会生成一个新的sessionID,存储在Cookie中,相当于新创建了一个session

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值