一、session销毁控制层代码
public class InvalidateSession extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().invalidate();//执行销毁session的操作 } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); }}二、监听代码
public class MyHttpSessionListener implements HttpSessionListener {
@Override public void sessionCreated(HttpSessionEvent arg0) { // 当前人数加1 // 看ServletContext域中是否已经存储了count 如果没有是第一个人访问 ,如果有就加1 // 获取存储域对 全局 ServletContext context = arg0.getSession().getServletContext(); // 获取指定属性名称的参数值 Object obj = context.getAttribute("count"); System.out.println(obj); if (obj == null) { context.setAttribute("count", 1); } else { int count = (Integer) obj; count++; context.setAttribute("count", count); } } /** * 当浏览器关闭的时候,不会调用此方法 * 1.当session失效 session默认有效时间 30分钟 * 2.执行了session.invalidate(); */ @Override public void sessionDestroyed(HttpSessionEvent arg0) { System.out.println("--------sessionDestroyed------"); // 获取存储域对 全局 ServletContext context = arg0.getSession().getServletContext(); // 获取指定属性名称的参数值 Object obj = context.getAttribute("count"); if (obj != null) { int count = (Integer) obj; count--; context.setAttribute("count", count); } }}三、显示层代码<script type="text/javascript">
//当关闭窗体前 window.onbeforeunload = function(){ //调用这个请求 去销毁session 当前会话的session window.location.href="http://localhost:8080/count/destorysession.do"; }; </script><body>
<%-- ServletContext setAttribute("count",count); --%> <h1>当前在线的人数是:${count}</h1> </body>
当一个会话关闭时,在线人数会相应减少。如果没有一中的session销毁控制层代码和三中的javascript代码,则会话增多时,显示在线人数会增加,但会话减少时,没有响应,
这是因为浏览器关闭时不会调用sessionDestroyed方法。