HttpSession对象详解
HttpSession是由JavaWeb提供用来会话跟踪的类,Session是服务器端对象,保存在服务器,它的底层是依赖Cookie,或者是URL重写。
详细的session介绍见JSP session对象详解
会话范围
某个用户首次访问服务器开始,到该用户完全退出这个项目(也就是同一个浏览器访问服务器到关闭浏览器) ;如果一个用户对服务的多次连贯性请求, 就是用户的多次请求中间没有关闭浏览器,那么session一直有效,只到用户关闭浏览器。
创建session
1. 若当前的JSP是客户端访问的当前WEB应用的第一个资源,且JSP的page指定的session属性值为 false, 则服务器就不会为JSP创建一个 HttpSession对象。
2. 若当前JSP不是客户端访问的当前WEB应用的第一个资源,且其他页面已经创建一个HttpSession 对象,则服务器也不会为当前 JSP 页面创建一个HttpSession对象,而回会把和当前会话关联的那个HttpSession对象返回给当前的JSP页面.
3. 若Serlvet是客户端访问的第一个WEB应用的资源, 则只有调用了request.getSession()或request.getSession(true)才会创建 HttpSession对象。
获取session
1. 获取cookie中的request.getSession()方法,获取Cookie中的SessionId;
2. 如果SessionId不存在,创建Session,把Session 保存起来,把新创建的SessionID保存到cookie中
3. 如果SessionId存在,通过SessionId查找Session对象,如果没有查找到,创建Session,把Session保存到新创建的SessionId的cookie中
4. 如果SessionId存在,通过SessionId查找到了Session对象,那么就不会再创建Session对象了
5. 返回Session
如果创建了新的Session,浏览器会得到一个包含SessionId的cookie,这个cookie的生命值是-1,即只在内存中保存,关闭浏览器就丢弃。 下一次如果再次访问,因为从内存的cookie中可以找到Session,那么就是同一个Session。
销毁session
1. 直接调用 HttpSession 的 invalidate() 方法, 该方法使 HttpSession 失效
2. 服务器卸载了当前 WEB 应用.
3. 超出 HttpSession 的过期时间.
设置 HttpSession 的过期时间: session.setMaxInactiveInterval(5); 单位为秒
在 web.xml 文件中设置 HttpSession 的过期时间: 单位为分钟.
<session-config> <session-timeout>30</session-timeout> </session-config>
4. 关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。
URL重写session操作
Session依赖cookie,目的是让客户端发出请求时归还SessionId,这样才能找到对应的Session,如果客户端禁用了cookie,那么就无法得到SessionId。
URL重写的方式替代cookie ,让网站的所有超链接,表单中都添加一特殊的请求参数即SessionId,这样服务器可以通过获取请求参数得到SessionId,从而获得Session对象.
response.encode(String url)这个方法会对URL进行智能的重写,当请求中没有归还SessionId这个cookie,那么这个方法会重写URL,否则不重写,url必须是指向本站的url。
总结
session机制采用的是在服务器端保持 HTTP 状态信息的方案 。当程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否包含了一个session标识(即sessionId),如果已经包含一个sessionId则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为地在请求的URL后面附加上一个JSESSION的参数)。如果客户请求不包含sessionId,则为此客户创建一个session并且生成一个与此session相关联的sessionId,这个session id将在本次响应中返回给客户端保存。
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。