ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] # session ## 获得Session对象 ~~~ HttpSession session = request.getSession(); ~~~ 此方法会获得专属于当前会话的Session对象, 如果服务器端没有该会话的Session 对象会创建一个新的Session返回, 如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在session了) ## session中存取数据(session也是一个域对象) Session也是存储数据的区域对象,所以session对象也具有如下三个方法: ~~~ session.setAttribute(String name, Object obj); Object session.getAttribute(String name); session.removeAttribute(String name); ~~~ ## Session对象的生命周期 创建:第一次执行request.getSession()时创建 销毁: 1. 服务器(非正常)关闭时 2. session过期/失效(默认30分钟) 问题:时间的起算点 从何时开始计算30分钟? 从不操作服务器端的资源开始计时 可以在web.xml中进行配置 单位分钟 tomcat的web.xml和工程的web.xml都可以配置 ~~~ <session-config> <session-timeout>30</session-timeout> </session-config> ~~~ 3. 手动销毁session ~~~ session.invalidate(); ~~~ 作用范围: 默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象 ## jsp中session ~~~ <% //判断session对象是否为新创建的 System.out.println(session.isNew()); //获取session对象的闲置时间,最后一次操作开始计时 System.out.println(session.getMaxInactiveInterval()); //获取session对象的id System.out.println(session.getId()); //让session对象立即失效 session.invalidate(); //修改session对象的有效时间,单位秒 //=0 默认情况,一次会话有效 //<0 禁用,session对象永久有效 session.setMaxInactiveInterval(0); %> ~~~ # 钝化和活化 **钝化** 服务器在关闭时会将session对象序列化保存到本地:SESSIONS.ser session自动钝化时间:默认5分钟,如果session对象超过一定时间没有使用会被自动钝化到SESSIONS.ser中,用户再次操作时会自动活化 如果希望session域中的属性可以和session一起钝化到磁盘中,那这些属性必须实现java.io.Serializable接口 当访问服务器的用户过多的话,会有非常多的会话产生,这些会话,每一个会话都会对应一个HttpSession对象 **活化** 服务器再开始时会将SESSIONS.ser反序列化加载到服务器内存中,session又可以使用了 **配置** 在tomcat的配置文件conf/context.xml文件的根标签中加入如下代码 ~~~ <Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1"> <Store className="org.apache.catalina.session.FileStore" directory="mySession" /> </Manager> ~~~ maxIdleSwap属性:指的session闲置时间,当闲置一定时间以后,会自动钝化到硬盘中 directory属性:session钝化后的目标文件夹 # request.getSession原理 ![](https://box.kancloud.cn/922efc5630f5853feb8c4f41edff921d_1097x612.png)