JavaWeb状态与会话管理Session
1、什么是Session?
(1)使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度。(2)Session技术是一种将会话状态保存在服务器端的技术 ,它可以比喻成是医院发放给病人的病历卡和医院为每个病人保留的病历档案的结合方式 。
(3)客户端需要接收、记忆和回送 Session的会话标识号,Session可以且通常是借助Cookie来传递会话标识号。
2、Session的跟踪机制(1)HttpSession对象是保持会话状态信息的存储结构,一个客户端在WEB服务器端对应一个各自的HttpSession对象。
(2)WEB服务器并不会在客户端开始访问它时就创建HttpSession对象,只有客户端访问某个能与客户端开启会话的Servlet程序时,WEB应用程序才会创建一个与该客户端对应的HttpSession对象。
(3)WEB服务器为HttpSession对象分配一个独一无二的会话标识号,然后在响应消息中将这个会话标识号传递给客户端。客户端需要记住会话标识号,并在后续的每次访问请求中都把这个会话标识号传送给WEB服务器,WEB服务器端程序依据回传的会话标识号就知道这次请求是哪个客户端发出的,从而选择与之对应的HttpSession对象。
3、Session的超时管理
(1)WEB服务器无法判断当前的客户端浏览器是否还会继续访问,也无法检测客户端浏览器是否关闭,所以,即使客户已经离开或关闭了浏览器,WEB服务器还要保留与之对应的HttpSession对象。
(2)随着时间的推移而不断增加新的访问客户端,WEB服务器内存中将会因此积累起大量的不再被使用的HttpSession对象,并将最终导致服务器内存耗尽。
(3)WEB服务器采用“超时限制”的办法来判断客户端是否还在继续访问,如果某个客户端在一定的时间之内没有发出后续请求,WEB服务器则认为客户端已经停止了活动,结束与该客户端的会话并将与之对应的HttpSession对象变成垃圾。
(4)如果客户端浏览器超时后再次发出访问请求,WEB服务器则认为这是一个新的会话的开始,将为之创建新的HttpSession对象和分配新的会话标识号。
(5)会话的超时间隔可以在web.xml文件中设置,其默认值由Servlet容器定义。 <session-config><session-timeout>30</session-timeout></session-config>
4、HttpSession接口中的方法getId方法getCreationTime方法getLastAccessedTime方法setMaxInactiveInterval方法getMaxInactiveInterval方法isNew方法invalidate方法getServletContext方法setAttribute方法getAttribute方法removeAttribute方法getAttributeNames方法
5、Application与session域范围的属性比较
HttpSession session = request.getSession();Integer sessionCount = (Integer)session.getAttribute("count");int count = 0;if(sessionCount != null){count = sessionCount.intValue();}out.println("当前会话中发生了" + (++count) + "次访问<br>");session.setAttribute("count",new Integer(count));count = 0;ServletContext application = getServletContext();Integer applicationCount = (Integer)application.getAttribute("count");if(applicationCount != null){count = applicationCount.intValue();}out.println("WEB应用程序中发生了" + (++count) + "次访问<br>");application.setAttribute("count",new Integer(count));