Session会话对象
Session是什么
- Session 是Jsp的九大内置对象之一,四大域对象之一,会话对象之一。
- Jsp九大内置对象:
- 【request,response,out,session,pageContext,application,page,config,exception】
- Jsp四大域对象:
- 【pageContext,request,session,appliction】
Session的工作原理
- 浏览器【第一次】向服务器发送请求
- 服务器接收到请求后,创建一个Session对象,同时创建一个特殊的Cookie对象【Cookie的name是固定的,为JSESSIONID,Cookie的value是Session的id】,并将Cookie发送给浏览器。
- 以后浏览器再次向服务器发送请求,就会携带特殊的Cookie
- 服务器通过Cookie找到对应的session,从而区分不同浏览器
工作原理扩展
- 浏览器不是第一次访问服务器【jsp或者servlet不是第一次通过request.getSession()获取session对象】
- 服务器会优先获取已创建的session对象:通过特殊的Cookie【JESSIONID】
- 如果JESSIONID不存在,那么就无法找到Session对象。服务器就会重新创建Session对象和特殊的Cookie,发送给浏览器
- 如果JESSIONID存在,会判断Session是否存活【tomcat默认存活30min】
- 如果session在有效时间[空闲时间],则可以直接使用
- 如果session不在有效时间[空闲时间],则服务器就会重新创建Session对象和特殊的Cookie,发送给浏览器
Session的使用
- Session的创建
- 第一次调用request.getSession()时,服务器创建Session对象。
- jsp的本质上也是调用(HttpServletRequest)request.getSession()时,创建Session对象。- Session的获取
- jsp:内置对象 直接使用
- html:通过servlet:request.getSession();- Session的修改
- session.setAttribute(String key,Object value);
- Object obj = session.getAttribute(String key);
- session.removeAttribute(String key);
Session的有效时间
默认Session存活30分钟
在Tomcat----->conf----->web.xml 可以看到默认设置
<!-- ==================== Default Session Configuration ================= -->
<!-- You can set the default session timeout (in minutes) for all newly -->
<!-- created sessions by modifying the value below. -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
Session空闲时间设置[非活动时间]
全局设置
- 在项目的web.xml中配置
<session-config> <session-timeout>30</session-timeout> </session-config>
局部设置
- 使用session.setMaxInactiveInterval(int seconds)
- 入参>0:设置当前session的空闲时间为seconds秒
- 入参<=0:永不失效
Session的持久化
- 思路:
- 先持久化特殊的Cookie 【name=JESSIONID 】
- 再持久化Session对象 【如果持久化的时间<=30min 则可以省略该步骤】
Session对象的销毁
- session对象空闲时间达到了设置的最大值
- session对象被强制失效【session.invalidate();】
- web应用卸载
- 服务器进程停止
Session钝化与活化
- 为什么说会话与浏览器有关,与服务器无关?
- 明明session是由服务器创建的,却说与服务器无关,这不是自相矛盾吗?
- 这是因为session的钝化活化机制导致的:因为session的钝化活化机制,使得会话看起来与服务器无关。
- 什么是session的钝化?
- session在一段时间内没有被使用或是关闭服务器时,就会将session对象以及对象中的数据序列化到磁盘中,这个从内存保存到磁盘的过程,就称之为序列化。序列化的数据需要支持实现Serializable接口。
- 什么是session的活化?
- session被钝化后,服务器再次调用session对象或者重启打开服务器时,将session对象以及对象中的数据从磁盘中序列化到内存的过程,称为活化。
表单重复提交问题
- 危害:重复提交已付款的表单,付一次钱下多个订单。
- 解决方式:
- 生成一个不可重复的uuid
- 提交表单前,将uuid存入session与对象和表单的隐藏域中
- 发送提交表单请求
- 后端进行判断:分别获取隐藏域和session域的uuid比较
- 相等,则提交表单,并删除session中的uuid
- 不相等,则不提交表单