Session原理分析以及Session的细节
Session原理分析
session的实现是依赖于cookie的
当客户端第一次请求会话对象时,服务器会创建一个 Session 对象,并为该 Session 对象分配一个唯一的 SessionID (用来标识这个 Session 对象);
服务器将 SessionID 以 Cookie(Cookie 名称为:“ JSESSIONID ”,值为 SessionID 的值,如 Set-Cookie:JESSIONID=10 )的形式发送给客户端浏览器;
客户端浏览器再次发送 HTTP 请求时,会将携带 SessionID 的 Cookie (如 cookie: JESSIONID=10 )随请求一起发送给服务器;
服务器从请求中读取 SessionID,然后根据 SessionID 找到对应的 Session 对象。
在 同一次会话中 ,多次请求获取的是 同一个Session对象
注意:
流程中的 Cookie 是容器自动生成的,它的 maxAge 属性取值为 -1,表示仅当前浏览器有效。
浏览器关闭时,对应的 Session 并没有失效,但此时与此 Session 对应的 Cookie 已失效,导致浏览器无法再通过 Cookie 获取服务器端的 Session 对象。
同一浏览器的不同窗口共享同一 Session 对象,但不同浏览器窗口之间不能共享 Session 对象。
Session的细节
1、当客户端关闭后,服务器不关闭,再次获取session是否是同一个?
默认情况下:不是
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
@WebServlet("/SessionDemo3") public class SessionDemo3 extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //使用session共享数据 HttpSession session = request.getSession(); System.out.println(session); //期望客户端关闭后,session也能相同 Cookie cookie = new Cookie("JSESSIONID",session.getId()); cookie.setMaxAge(60*60); response.addCookie(cookie); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
2、当客户端不关闭,服务器关闭后,再次获取session是否是同一个?
不是同一个对象,但是要确保数据不丢失
session的钝化:
在服务器正常关闭之前将session对象序列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
3、session什么时候被销毁
1、服务器关闭
2、session对象调用invalidate()
3、session默认失效时间30分钟
选择性配置修改
在E:\apache-tomcat-9.0.39\conf\web.xml中修改
<session-config> <session-timeout>30</session-timeout> </session-config>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix