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原创文章,未经本站允许不得转载。