`
feipigzi
  • 浏览: 111850 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(解决浏览器关闭不调用sessionDestroyed方法)(转自酷猫地带)

阅读更多
编写SessionCounter类实现HttpSessionListener接口:

public class SessionCounter implements HttpSessionListener {

     private static int activeSessions = 0;

public void sessionCreated(HttpSessionEvent se) {
      activeSessions++;
}

public void sessionDestroyed(HttpSessionEvent se) {
   if(activeSessions > 0)
      activeSessions--;
}

public static int getActiveSessions() {
     return activeSessions;
}
}

然后在web.xml添加一个监听器:

<listener>
<listener-class>SessionCount.SessionCounter</listener-class>
</listener>

我们可以通过getActiveSessions方法获取当前在线人数,但是,如果用户关闭浏览器的话,我们的在线人数是不会马上变的,即不会马上调用sessionDestroyed方法,只有等到session过期才会调用。

那么,怎样解决关闭浏览器的问题呢?

首先sessionDestroyed方法在以下两种情况下会调用:

1.session过期。

2.调用session.invalidate()方法。

那么我们编写一个Servlet用于session的invalidate:

public class CloseSessionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CloseSessionServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   // TODO Auto-generated method stub
   request.getSession().invalidate();
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   // TODO Auto-generated method stub
   request.getSession().invalidate();
}

}

当我们关闭浏览器的时候,使用JavaScript捕获关闭浏览器的事件(onbeforeunload事件),然后发请求调用服务端的session的invalidate方法:

<% String clsoeSessionPath = "http://" + request.getServerName() + ":" + request.getServerPort() + "/test/CloseSession"; %>
<script type="text/javascript">
    window.onbeforeunload = function()  
    {  
        if(event.clientX>document.body.clientWidth&&event.clientY<0||event.altKey)  
        {  
        window.location.href='<%=clsoeSessionPath%>';       
        }  
    }    
</script>

那么就解决了关闭浏览器,sessionDestroyed方法没有马上调用的问题。
分享到:
评论

相关推荐

    Java跨浏览器购物车的简单实现

    在跨浏览器购物车的应用场景中,使用 Cookie 的主要优势是它能够跨页面传递数据,但由于其大小限制(通常不超过4KB),不适合存储大量的购物车商品信息。 - **优点**:简单易用,无需服务器端处理。 - **缺点**: ...

    单一登录踢人效果

    在Session销毁时,我们需要调用DelSession方法,该方法用于删除Session对象并从sessionMap中删除对应的Session对象。在DelSession方法中,我们首先判断Session对象是否为空,如果不为空,则删除Session对象并从...

    springboot 用监听器统计在线人数案例分析

    这是因为浏览器关闭时,session销毁的回调方法sessionDestroyed没有被触发。为了解决这个问题,可以在前端关闭页面时调用后端接口,让后端手动减少session数量或采取其他措施。 总结来说,使用HttpSessionListener...

    Java Web应用开发 53 课堂案例-应用监听器统计在线人数.docx

    在`sessionDestroyed`方法中调用`OnlineCounter.reduce()`,表示用户离线。这两个方法会在相应的会话生命周期事件发生时被自动调用。 为了使`OnlineCounterListener`生效,我们需要在应用程序的部署描述符`web.xml`...

    JSP+Servlet选择题.doc

    12. Web应用关闭时调用的方法:当Web应用程序关闭时,Servlet容器会调用`ServletContextListener`的`contextDestroyed()`方法。所以正确答案是B。 13. 与`HttpSessionListener`接口相关的方法:`...

    servlet--listener 各种接口的简单例子

    你可以实现这个接口,当新的会话创建时,系统会调用sessionCreated()方法,会话销毁时调用sessionDestroyed()方法。这在管理会话跟踪和资源分配时非常有用。 2. **ServletRequestListener**:这个接口监听HTTP请求...

    HttpSessionListener监听session的创建及销毁,实现在线用户统计

    用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...

    Servlet中的八大Listener

    - **作用**:当用户开始一个新的会话时调用`sessionCreated()`,当会话结束时调用`sessionDestroyed()`。这可用于跟踪用户的登录状态和其他会话相关的数据。 4. **HttpSessionAttributeListener** - **事件方法*...

    Servlet中监听器介绍.doc

    `sessionCreated`方法在新的HttpSession被创建时调用,`sessionDestroyed`方法在HttpSession失效或被显式地销毁时调用。这为跟踪用户会话、统计在线用户数量等提供了便利。 - `HttpSessionAttributeListener`接口:...

    Spring boot通过HttpSessionListener监听器统计在线人数的实现代码

    2. `sessionDestroyed(HttpSessionEvent event)`:当HttpSession即将从与当前请求相关联的会话中移除时触发此方法。此方法适用于减少在线人数计数,比如用户退出或者session过期。 其次,理解实现统计逻辑的过程: ...

    servlet监听器

    - HttpSession:当浏览器与服务器建立会话时创建,会话无效(如调用invalidate()方法或超时)时销毁。 - ServletRequest:每次HTTP请求开始时创建,请求处理完毕后销毁。 5. 相关接口: - ServletContextListener:...

    session初始化+网站流量统计+在线人数

    此外,为了防止因用户浏览器关闭或网络断开导致的session意外销毁,通常会设置一个合理的Session超时时间,以确保在线人数的准确性。 实现这些功能的具体步骤如下: 1. 在web.xml配置文件中,添加...

    java listener监听器教程及实例

    - `sessionDestroyed()`:当销毁一个`HttpSession`对象时调用。 - **接收事件**:`HttpSessionEvent` - **触发场景**:每当一个新会话创建或现有会话结束时,容器会调用相应的监听器方法。 ##### 4. **...

    SSH集成Servlet监听

    当Session过期或被显式地销毁时,`sessionDestroyed`方法会被调用。 - `ServletRequestListener`:每当创建一个新的ServletRequest时,`requestInitialized`方法会被调用;当请求结束时,`requestDestroyed`方法会...

    session监听小例子

    为了解决这个问题,服务器会为每个客户端(浏览器)创建一个唯一的Session ID,并通过Cookie或者URL重写等方式将其返回给客户端。每次客户端请求时,都会带上这个Session ID,服务器根据ID找到对应的Session数据,...

    监听器.pdf

    在session过期/调用了invalidate方法销毁session时,该监听器方法被执行public void sessionDestroyed(HttpSessionEvent httpSessionEvent)。 3. ServletRequestListener:监听ServletRequest域对象的创建、销毁。...

    HttpSessionListener在线人数和历史访问量

    当一个`HttpSession`对象被销毁(如用户关闭浏览器、超时或手动注销)时,这个方法会被调用。我们可以在这个方法中记录在线人数的减少。同样,我们可以通过减一操作来更新全局变量,并同步到数据库。 ```java @...

    监听器实现在线人数统计

    此外,需要注意的是,基于Session的在线人数统计可能会存在一些问题,例如用户关闭浏览器但未正式登出,此时Session可能会因浏览器关闭而意外结束,导致在线人数统计不准确。为了解决这个问题,可以结合应用服务器的...

    JSP题库-62道.doc

    解释:当Web应用程序被关闭时,Servlet容器会调用ServletContext“监听器”的contextDestroyed()方法。 13. 与 HttpSessionListener 接口有关的方法是。(选择 2 项) 答:SessionCreated()、SessionDestroyed() ...

    session保证两用户不能同时登陆一个账号

    - **`sessionDestroyed`**:当`session`销毁时(例如,用户关闭浏览器或手动登出),则调用`UserContainer`的`delContainer`方法来移除该用户的记录。 ##### (2) 用户列表 - `UserContainer` ```java public class...

Global site tag (gtag.js) - Google Analytics