java统计在线人数详解|

 .一个账号登进去了,再用这个账号就登不进去:
     打开一个浏览器客户端就有个sessionid与服务器对用,关闭后客户端的没了,但是服务端的还有这个session,
缺点:所以非法关闭的话,没有调用session.invalidate()方法的话,这个session依然存在。只有等到session过期,一般30分钟。这样用户要等这么长时间,肯定不好,所以尽可能的要捕捉非法关闭的事件,网上搜了,有些事件不好捕获,如先最小化在关闭等。

2.一个账号登进去了,再用这个账号登进去,前一个session失效,提示账户已经在别处登录。
缺点:如果也是非法关闭。用户有没有重新登录,session没有释放,在线统计不太对,有点就是不影响用户使用,可以继续登进去使用。
所以选择第二种:
struts2  
1.action里的某个方法,

  1. public void totalcount()
  2. { httpservletrequest request = servletactioncontext.getrequest();
  3. httpsession session = request.getsession();
  4. //就是获取用户名,因为是struts2可以这样获取
  5. string username = user.getfirstname();
  6. // 把用户名放入在线列表
  7. map<string,string> onlineuserlist = (map<string,string>) servletactioncontext.getservletcontext().getattribute("onlineuserlist");
  8. // 第一次使用前,需要初始化
  9. if (onlineuserlist == null) {
  10. onlineuserlist = new hashmap<string,string>();

  11. }
  12. //用户名一样,sessionid不一样,所以是二次登录 if(onlineuserlist.containskey(username) && !(onlineuserlist.get(username).equals(session.getid())) )

  13. {
  14. onlineuserlist.remove(username);


  15. }
  16. session.setattribute("username", username);
  17. onlineuserlist.put(username,session.getid());

  18. servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);


  19. }
复制代码


2.listener,销毁session,只要调用session.invalidate()就会执行

  1. public class userlistener implements httpsessionlistener {

  2. public void sessioncreated(httpsessionevent event) {


  3. }
  4. @suppresswarnings("unchecked")
  5. public void sessiondestroyed(httpsessionevent event) {
  6. httpsession session = event.getsession();

  7. // 取得登录的用户名
  8. string username = (string) session.getattribute("username");
  9. servletcontext application = session.getservletcontext();
  10. system.out.println("listener开始");
  11. system.out.println("sessionid:"+session.getid());
  12. system.out.println("username:"+username);
  13. // 获取在线列表
  14. map<string,string> onlineuserlist = (map<string,string>) application.getattribute("onlineuserlist");
  15. //session超时删除用户,重复登录登录时已删除,不再删了
  16. if(onlineuserlist.containskey(username) && (onlineuserlist.get(username).equals(session.getid())) )
  17. {
  18. onlineuserlist.remove(username);
  19. servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
  20. }
  21. system.out.println("onlineuserlist:"+onlineuserlist);
  22. system.out.println("listener结束");

  23. }

  24. }
  25. 3.filter
  26. public class userfilter implements filter {
  27. public void init(filterconfig config) throws servletexception {
  28. }

  29. public void destroy() {
  30. }

  31. @suppresswarnings("unchecked")
  32. public void dofilter(servletrequest req, servletresponse res,
  33. filterchain chain) throws ioexception, servletexception {

  34. httpservletrequest request = (httpservletrequest) req;
  35. httpservletresponse response = (httpservletresponse) res;
  36. httpsession session = request.getsession();
  37. system.out.println("过滤filter开始");
  38. // 从servletcontext中取出list
  39. map<string, string> sessionlist = (map<string, string>) session
  40. .getservletcontext().getattribute("onlineuserlist");
  41. system.out.println("sessionlist:" + sessionlist);
  42. if (sessionlist == null) {
  43. sessionlist = new hashmap<string, string>();
  44. }

  45. string username = (string) session.getattribute("username");
  46. system.out.println("username:" + username);
  47. system.out.println("sessionid:" + session.getid());
  48. //因为过滤所有页面web.xml配置的是/*,第一次登陆username为空,得让可以登录
  49. if (null == username) {
  50. chain.dofilter(req, res);
  51. system.out.println("过滤filter结束username=null");

  52. } else {
  53. // 用于记录状态
  54. boolean temp = false;
  55. system.out.println(sessionlist.containskey(username));
  56. system.out.println(sessionlist.get(username));
  57. system.out.println(sessionlist.get(username)
  58. .equals(session.getid()));
  59. if (sessionlist.containskey(username)
  60. && sessionlist.get(username).equals(session.getid())) {
  61. // session值与当前id匹配,说明同一个用户
  62. temp = true;

  63. system.out.println("过滤filter结束,同一个用户");
  64. }
  65. // 存在了第二次登陆,销毁session
  66. system.out.println("temp:" + temp);
  67. if (!temp) {
  68. session.invalidate();
  69. response.setcharacterencoding("utf-8");
  70. response.setcontenttype("text/html; charset=utf-8");
  71. //转向的首页,根据自己项目
  72. response
  73. .getwriter()
  74. .print(
  75. "<script>window.top.location.href='/ssh2/save.jsp';alert('该账号已经在别处登录,请联系管理员或关闭ie,重新登录!');</script>");

  76. } else {
  77. chain.dofilter(req, res);
  78. }

  79. }

  80. }

  81. }
复制代码
web.xml的配置。
filter放在struts2拦截器的前面

  1. <filter>
  2. <filter-name>userfilter</filter-name>
  3. <filter-class>
  4. com.test.action.user.userfilter
  5. </filter-class>
  6. </filter>


  7. <filter-mapping>
  8. <filter-name>userfilter</filter-name>
  9. <url-pattern>/*</url-pattern>
  10. </filter-mapping>
  11. <filter>
复制代码

listener的配置
调用session.invalide()的方法会被监听到,销毁session

  1. <listener>
  2. <listener-class>com.test.action.user.userlistener</listener-class>
  3. </listener>
复制代码


 

转载自:http://www.csdnjava.com/forum.php?mod=viewthread&tid=742

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值