Session实现原理(Java)

Session实现原理

  • 结论:Session实现依赖Cookie
  • 图解
    在这里插入图片描述
  • SessionDemo1代码
@WebServlet("/session1")
public class SessionDemo1 extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 重点就这两行
    HttpSession s = request.getSession();
    s.setAttribute("msg", "Session");
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
  }
}

  • SessionDemo2代码
@WebServlet("/session2")
public class SessionDemo2 extends HttpServlet {
  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 重点就这三行
    HttpSession s = request.getSession();
    Object msg = s.getAttribute("msg");
    System.out.println(msg);
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);
  }
}
  • 当浏览器第一次访问/session1时发送的没有cookie的请求头,然后服务器穿件一个Session后在进行后续赋值Key/value操作,最后会自动返回一个Cookie信息
    在这里插入图片描述
    在这里插入图片描述

  • 当我们再次访问/session2时,会将所有的Cookie发送给服务器,服务器读取到Cookie名为JSESSIONID的值,然后再内存中创建的Session对象做对比,然后再进行取值后续操作。
    在这里插入图片描述
    在这里插入图片描述

  • 结论:Session实现依赖Cookie

客户端关闭后,服务器不关闭,一定时间内获取的Session为同一个

  • 因为Session默认是设置Cookiekey为JSESSIONID,默认是关闭浏览器即清除Cookie那么我们可以通过设置JSESSIONIDCookie存活时间达到目的。
  • 代码
    HttpSession s = request.getSession();
    System.out.println(s);
    Cookie cookie = new Cookie("JSESSIONID", s.getId());
    cookie.setMaxAge(60 * 60); // 一个小时自动删除
    response.addCookie(cookie);
  • 多次浏览器关闭后访问结果
org.apache.catalina.session.StandardSessionFacade@4c1c316c
org.apache.catalina.session.StandardSessionFacade@4c1c316c
org.apache.catalina.session.StandardSessionFacade@4c1c316c

浏览器不关闭,服务器关闭,两次访问返回的SESSION值是一样的吗?

  • 不一样,服务器关闭后,Session对象会被销毁,再次开启服务器访问时,内存中没有Session对象,无法跟请求头传过来的值匹配到。
  • tomcat中,它会session钝化服务器正常关闭前,将Session对象序列化在硬盘上,序列化)再Session活化服务器启动后,将Session文件转换为内存中的Session对象,反序列化
  • 演示:
// 主要代码块SessionDemo1
    HttpSession s = request.getSession();
    s.setAttribute("msg", "Session");
// 主要代码块SessionDemo2
    HttpSession s = request.getSession();
    Object msg = s.getAttribute("msg");
    System.out.println(msg);

第一次访问/session1后再访问/session2
在这里插入图片描述
服务器打印的结果
在这里插入图片描述
正常关闭tomcat
在这里插入图片描述
进行第二次直接访问/session2,开启服务器反序列化删除文件,再访问,此时地址可能不一样,但是里面存储的内容一定是一样的。
在这里插入图片描述

  • IDE编译器无法反序列化的原因是:它序列化确实也是在work文件夹下,但是重新启动服务器则会先删除wiork文件夹再进行反序列化

Session失效时间

  1. 服务器关闭
  2. Session对象调用invalidate()方法
  3. Session默认失效时间web.xml中修改,可以在tomcat服务器中改,也可以每个项目的web.xml中配
<Session-config>
	<Session-timeout>多少分钟</Session-timeout>
</Session-config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值