session机制是一种服务器端的机制,服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息。 当程序须要为某个客户端的请求建立一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识 - 称为session id,若是已包含一个session id则说明之前已经为此客户端建立过session,服务器就按照session id把这个session检索出来使用(若是检索不到,可能会新建一个),若是客户端请求不包含session id,则为此客户端建立一个session而且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 一、session在什么时候被建立 一个常见的误解是觉得session在有客户端访问时就被建立,然而事实是直到某server端程序调用 HttpServletRequest.getSession(true)这样的语句时才被建立,注意若是JSP没有显示的使用 <%@page session="false"%> 关闭session,则JSP文件在编译成Servlet时将会自动加上这样一条语句HttpSession session = HttpServletRequest.getSession(true);这也是JSP中隐含的session对象的来历。 因为session会消耗内存资源,所以,若是不打算使用session,应该在全部的JSP中关闭它。 二、session什么时候被删除 综合前面的讨论,session在下列状况下被删除a.程序调用HttpSession.invalidate();或b.距离上一次收到客户端发送的 session id时间间隔超过了session的超时设置;或c.服务器进程被中止(非持久session) 三、如何作到在浏览器关闭时删除session 严格的讲,作不到这一点。能够作一点努力的办法是在全部的客户端页面里使用javascript代码window.oncolose来监视浏览器的关闭动 做,而后向服务器发送一个请求来删除session。可是对于浏览器崩溃或者强行杀死进程这些很是规手段仍然无能为力。 四、有个HttpSessionListener是怎么回事 你能够建立这样的listener去监控session的建立和销毁事件,使得在发生这样的事件时你能够作一些相应的工做。注意是session的建立和 销毁动做触发listener,而不是相反。相似的与HttpSession有关的listener还有 HttpSessionBindingListener,HttpSessionActivationListener和 HttpSessionAttributeListener。