listner监听器 ___计算系统当前在线人数(解决浏览器关闭不调用sessionDestroyed方法)
2017-07-01 18:51
453 查看
计算系统当前在线人数(解决浏览器关闭不调用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方法没有马上调用的问题。
http://blog.163.com/chengwei_1104/blog/static/53645274201341524826633/
相关文章推荐
- 在线人数统计,解决了关闭浏览器窗口,释放session的问题
- c#关闭系统进程以及如何调用cmd并执行命令开发者在线 Builder.com.cn 更新时间:2008-08-05作者:乔毅 来源:IT168
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- windows2003远程桌面退出后系统自动注销程序关闭的解决方法
- 解决CentOS系统下浏览器不能在线听歌的问题
- session监听器(可用于统计在线人数,了解系统当前的使用客户)
- jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法
- 两种统计当前在线人数的方法
- discuz在线人数修改及注册非法字符提示解决方法
- 利用java反射解决 Android系统方法不能调用的情况
- jsp防止重复登录问题以及关闭浏览器,意外断电等情况使用户退出的解决方法
- 转:“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”的解决方法
- 解决session关闭时再调用对象方法时报session已关闭问题
- C#和Asp.net下调用Excel后无法自动关闭进程的解决方法
- java 调用 bat 如果里面用了第三方命令 dos 窗口没有关闭 解决方法
- silverlight 退出系统(关闭当前网页),通过调用JS
- 下载文件时报错 "由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值" 解决方法
- 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”的解决方法
- 关闭浏览器窗体时弹出提示框较完美解决方法
- C# richTextBox控件中 点击超链接 自动调用系统浏览器打开 三步解决