session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。
当程式需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,如果已包含一个session id则说明以前已为此客户端创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个和此session相关联的session id。保存这个session id的方式能采用cookie,这样在交互过程中浏览器能自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于SEEESIONID,而。比如weblogic对于web应用程式生成的cookie,JSESSIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764,他的名字就是JSESSIONID。这个session cookie是保存在浏览器的内存中的。
“只要关闭浏览器,session就消失了”,这是一种很不严禁的说法。session是服务器创建的,要想删除session除非程序通知服务器删除一个session,否则服务器会一直保留。
然而浏览器是不会在关闭的时候通知服务器他将要关闭,因此服务器根本不会知道浏览器已关闭。之所以会有这种错觉,是因为大部分session机制都使用会话cookie来保存session id,
而关闭浏览器后这个cookie 是会销毁的所以这个session id就消失了,再次连接服务器时也就无法找到原来的session。
如果服务器设置的cookie被保存到硬盘上,或使用某种手段改写浏览器发出的HTTP请求头(URL重写),把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session。
session持久化:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" session="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <%= session.getId() %> <% Cookie cookie = new Cookie("JSESSIONID", session.getId()); cookie.setMaxAge(20);//session持久化 20秒当浏览器关闭20秒内这个session id依然存在 response.addCookie(cookie); %> </body> </html>
URL重写:
Web 服务器在返回Response的时候,检查页面中所有的URL,包括所有的连接,和HTML Form的Action属性,在这些URL后面加上“;jsessionid=XXX”。
下一次,用户访问这个页面中的URL。jsessionid就会传回到Web Server。
设置session超时:
关闭浏览器不会导致session被删除,迫使服务器为seesion设置了一个失效时间,当距离客户端上一次使用session的时间超过这个失效时间时,服务器就能认为客户端已停止了活动,才会把session删除以节省存储空间。一般我们会在WEB.xml中配置
<session-config> <session-timeout>30</session-timeout><!-- 30分钟--> </session-config>
session的生命周期:
1、session的创建时间
一个常见的误解是以为session在有客户端访问时就被创建,事实是直到某web服务器调用HttpServletRequest.getSession(true)这样的语句时才被创建,注意如果JSP没有显示的使用 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。由于session会消耗内存资源,因此,如果不打算使用session,应该在所有的JSP中关闭他,<%@ page session="false"%>。注意这个属性只是禁用了
jsp中session这个隐含对象,我们依然可以显式的使用session
<% HttpSession session = request.getSession(true); out.println(session); out.print("<br>"); //获取 Session 的最大时效, 默认为 30 分钟. out.print(session.getMaxInactiveInterval()); session.invalidate(); %>
总结:session的创建时间是客户端第一次与wb服务器交互并且web服务器调用HttpServletRequest.getSession(true);
Session 对象的销毁:
①. 直接调用 HttpSession 的 invalidate()
②. HttpSession 超过过期时间.
> 返回最大时效: getMaxInactiveInterval() 单位是秒 > 设置最大时效: setMaxInactiveInterval(int interval)
> 可以在 web.xml 文件中配置 Session 的最大时效, 单位是分钟.
<session-config>
<session-timeout>30</session-timeout>
</session-config>
③. 卸载当前 WEB 应用. 注意: 关闭浏览器不会销毁 Session!