Session的API:
HttpSession接口
- 创建或得到Session对象
HttpSession getSession()
HttpSession getSession(boolean create)
- session对象操作会话数据(域对象)
void setAttribute(java.lang.String name, java.lang.Object value) 保存数据
java.lang.Object getAttribute(java.lang.String name) 得到数据
void removeAttribute(java.lang.String name) 清除数据
- 设置session对象
void setMaxInactiveInterval(int interval) 设置session有效时长
java.lang.String getId() 得到session对象编号
void invalidate() 销毁session对象
猜测Session原理:
问题: 服务器如何识别不同的浏览器客户端???
前提: 取出数据的session和保存数据的session对象应该是同一个session对象
浏览器1(标记001):把会话数据保存到session对象中
HttpSession session = request.getSession(); (session对象:标记001)
session.setAttribute("name", "rose");
浏览器1(标记001): 从session对象取出会话数据
(服务器得到标记001,在服务器内存中搜索是否存在001标记的session对象)
HttpSession session = request.getSession(); (是)
String name = (String)session.getAttribute("name"); (可以得到)
浏览器1(新窗口)(标记001):从session对象取出会话数据
HttpSession session = request.getSession(); (是)
String name = (String)session.getAttribute("name"); (可以得到)
浏览器2(没有标记001):从session对象取出会话数据
HttpSession session = request.getSession(); (不是)
String name = (String)session.getAttribute("name"); (不能取出)
新的浏览器1(没有标记001):从session对象取出会话数据
HttpSession session = request.getSession(); (不是)
String name = (String)session.getAttribute("name"); (不能取出)
Session原理:
- 服务器创建Session对象,分配一个唯一的标记(JSESSIONID),会话数据保存sessino对象中,然后服务器把JSESSION作为cookie发送给浏览器保存
响应头: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E - 浏览器得到JSESSIONID的cookie,保存在浏览器的目录中
- 浏览器在下次访问服务器时,带着JSESSIONID的cookie数据访问服务器。
请求头:Cookie: JSESSIONID=7EBC5D0B44D9D3DDE7FAD83C077E3D3E - 服务器得到JSESSIONID,在服务器内存中查询是否存在对应的编号的session对象。
- 如果找到对应的session对象,返回这个对象
- 如果找不到对应的session对象,有可能返回null,也有可能是创建新的session对象。
Session细节:
- 得到session对象编号: getId() 得到JSESSION的cookie值。
- 设置session有效时长:
注意: 关闭浏览器不会导致session对象销毁!!
2.1 默认时间: 30分钟后,服务器自动回收session对象。(最后一次访问session开始计算)
2.2 代码设置session的有效时长:
void setMaxInactiveInterval(int interval) 以秒为单位
2.3 全局设置session的有效时长:
在web.xml文件中,设置
<!-- 配置session的有效时长:以分为单位 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
2.4 立即手动销毁session对象:invalidate()
request.getSession()方法
HttpSession getSession()/getSession(true) 创建或得到session对象。当前没有找到对应的session 对象,创建新的session对象
HttpSession getSession(false) 得到session对象。如果找不到,则返回null默认情况下,JSESSSOIN的cookie保存在浏览器内存,如果要保存到硬盘。
Cookie cookie = new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(100000);
response.addCookie(cookie);