编写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方法没有马上调用的问题。
分享到:
相关推荐
在跨浏览器购物车的应用场景中,使用 Cookie 的主要优势是它能够跨页面传递数据,但由于其大小限制(通常不超过4KB),不适合存储大量的购物车商品信息。 - **优点**:简单易用,无需服务器端处理。 - **缺点**: ...
在Session销毁时,我们需要调用DelSession方法,该方法用于删除Session对象并从sessionMap中删除对应的Session对象。在DelSession方法中,我们首先判断Session对象是否为空,如果不为空,则删除Session对象并从...
这是因为浏览器关闭时,session销毁的回调方法sessionDestroyed没有被触发。为了解决这个问题,可以在前端关闭页面时调用后端接口,让后端手动减少session数量或采取其他措施。 总结来说,使用HttpSessionListener...
在`sessionDestroyed`方法中调用`OnlineCounter.reduce()`,表示用户离线。这两个方法会在相应的会话生命周期事件发生时被自动调用。 为了使`OnlineCounterListener`生效,我们需要在应用程序的部署描述符`web.xml`...
12. Web应用关闭时调用的方法:当Web应用程序关闭时,Servlet容器会调用`ServletContextListener`的`contextDestroyed()`方法。所以正确答案是B。 13. 与`HttpSessionListener`接口相关的方法:`...
你可以实现这个接口,当新的会话创建时,系统会调用sessionCreated()方法,会话销毁时调用sessionDestroyed()方法。这在管理会话跟踪和资源分配时非常有用。 2. **ServletRequestListener**:这个接口监听HTTP请求...
用户登录时,调用LoginServlet,将用户名写入application的在线用户列表中,用户退出时,调用LogoutServlet,调用session.invalidate(),交给HttpSessionListener的sessionDestroyed()方法,将用户从在线列表中删除。...
- **作用**:当用户开始一个新的会话时调用`sessionCreated()`,当会话结束时调用`sessionDestroyed()`。这可用于跟踪用户的登录状态和其他会话相关的数据。 4. **HttpSessionAttributeListener** - **事件方法*...
`sessionCreated`方法在新的HttpSession被创建时调用,`sessionDestroyed`方法在HttpSession失效或被显式地销毁时调用。这为跟踪用户会话、统计在线用户数量等提供了便利。 - `HttpSessionAttributeListener`接口:...
2. `sessionDestroyed(HttpSessionEvent event)`:当HttpSession即将从与当前请求相关联的会话中移除时触发此方法。此方法适用于减少在线人数计数,比如用户退出或者session过期。 其次,理解实现统计逻辑的过程: ...
- HttpSession:当浏览器与服务器建立会话时创建,会话无效(如调用invalidate()方法或超时)时销毁。 - ServletRequest:每次HTTP请求开始时创建,请求处理完毕后销毁。 5. 相关接口: - ServletContextListener:...
此外,为了防止因用户浏览器关闭或网络断开导致的session意外销毁,通常会设置一个合理的Session超时时间,以确保在线人数的准确性。 实现这些功能的具体步骤如下: 1. 在web.xml配置文件中,添加...
- `sessionDestroyed()`:当销毁一个`HttpSession`对象时调用。 - **接收事件**:`HttpSessionEvent` - **触发场景**:每当一个新会话创建或现有会话结束时,容器会调用相应的监听器方法。 ##### 4. **...
当Session过期或被显式地销毁时,`sessionDestroyed`方法会被调用。 - `ServletRequestListener`:每当创建一个新的ServletRequest时,`requestInitialized`方法会被调用;当请求结束时,`requestDestroyed`方法会...
为了解决这个问题,服务器会为每个客户端(浏览器)创建一个唯一的Session ID,并通过Cookie或者URL重写等方式将其返回给客户端。每次客户端请求时,都会带上这个Session ID,服务器根据ID找到对应的Session数据,...
在session过期/调用了invalidate方法销毁session时,该监听器方法被执行public void sessionDestroyed(HttpSessionEvent httpSessionEvent)。 3. ServletRequestListener:监听ServletRequest域对象的创建、销毁。...
当一个`HttpSession`对象被销毁(如用户关闭浏览器、超时或手动注销)时,这个方法会被调用。我们可以在这个方法中记录在线人数的减少。同样,我们可以通过减一操作来更新全局变量,并同步到数据库。 ```java @...
此外,需要注意的是,基于Session的在线人数统计可能会存在一些问题,例如用户关闭浏览器但未正式登出,此时Session可能会因浏览器关闭而意外结束,导致在线人数统计不准确。为了解决这个问题,可以结合应用服务器的...
解释:当Web应用程序被关闭时,Servlet容器会调用ServletContext“监听器”的contextDestroyed()方法。 13. 与 HttpSessionListener 接口有关的方法是。(选择 2 项) 答:SessionCreated()、SessionDestroyed() ...
- **`sessionDestroyed`**:当`session`销毁时(例如,用户关闭浏览器或手动登出),则调用`UserContainer`的`delContainer`方法来移除该用户的记录。 ##### (2) 用户列表 - `UserContainer` ```java public class...