Web开发学习笔记:Session会话管理(已完成)

这篇文章是本人的学习笔记,主要学习资料是JSP&Servlet学习笔记(第三版),林信良著,清华大学出版社出版


Web开发学习笔记:Session会话管理

session大家都知道用于会话管理,Servlet中常用就是获取session(request.getSession()),session属性的读取(setAttribute(),getAttribute()),令session失效(invalidate())等。这篇笔记不再介绍这些方法常用且基础的东西,而是回去说较为深入一些的东西。

一、HttpSession原理和试用注意事项

session这东西并不是属于http协议,毕竟http是无状态的协议。

只不过为了实现一些业务场景,多次网页的访问还是需要记录一些信息的,既然http不能记录信息,那容器可以啊,所以session是容器搞出来的。

容器的本质就是Java程序,里面的HttpServletRequest,HttpServletResponse等也都是一个个Java对象,session也不例外。所以session是存储在容器中的,并且容器还负责管理session的生命周期。

每个session都有自己的sessionId,我们通过getId()就能获取到,这个id用来标识session。
一个用户在远程浏览器上登录服务器,登录成功后,服务器会为这个用户(浏览器)创建一个session,这个session的专属sessionId也会自动生成存储在这个session之中,同时,这个sessionId也会存储在远程浏览器的cookie之中。

这样,当用户再次访问服务器时,cookie中的sessionId会跟着请求一起传给服务器。服务器就可以根据这个sessionId来检查是否有对应的session对象。

以上就是session实现会话的原理。



因为session是存储在服务器上的Java对象,所以使用session传值的时候,不用存储体量打的数据。

所以当服务器重启后,所有的session都会失效(为了防止这个,我们可以在重启前将所有的session对象序列化存储到硬盘中,重启后在从硬盘中恢复session)。这里要明白的是,服务器重启,失效的是session,远程浏览器中的cookie的sessionId并没有失效,只是根据这个sessionId再也找不到对应的session了。

说道session失效,我们手动设定session失效时间。
setMaxInactivaInterval(),这个方法设定的是浏览器多久没有请求服务器的话,这个浏览器对应的session就会自动失效,单位是秒。这个方法设定的是服务器中的session失效的时间,不是浏览器中cookie里sessionId的失效时间。

除了使用上面那个方法,还可以设置web.xml来实现。

<web-app>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
</web-app>

不过上面的单位不是秒,是分钟。

如果想要设置cookie中sessionId的存活时间,可以使用Servlet 3.0的SessionCookieConfig接口,这个以后再写吧。

二、HttpSession与URL重写

从上面的笔记中可以了解,session是基于cookie实现的。如果用户在浏览器禁用cookie,那么seesion就无法实现。

在这样的情况下,如果还要用session来进行会话管理,那还可以使用URL重写。URL重写说白了,就是将sessionId放到地址后进行传参,将sessionId以get方式传递。

在HttpServletResponse中有encodeURL()这个方法帮我们自动进行URL重写。
在这里插入图片描述
该方法的参数是准备重写的地址。如果服务器无法从cookie中获取到sessionId(多半是浏览器禁用id引起的),那么encodeURL()会将sessionId加入到地址中返回;如果服务器可以从cookie中取到sessionId,那么久encode会直接返回地址,不做任何处理。

猜你喜欢

转载自blog.csdn.net/sinat_38393872/article/details/105163621