`
iloveoracle
  • 浏览: 118913 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

统计在线人数重复登录

    博客分类:
  • java
阅读更多
    <div style="text-align: left">防止web应用同一个账户重复登录一般有一下两种方式:
session实现
1.一个账号登进去了,再用这个账号就登不进去:
打开一个浏览器客户端就有个sessionid与服务器对用,关闭后客户端的没了,但是服务端的还有这个session,
缺点:所以非法关闭的话,没有调用session.invalidate()方法的话,这个session依然存在。只有等到session过期,一般30分钟。这样用户要等这么长时间,肯定不好,所以尽可能的要捕捉非法关闭的事件,网上搜了,有些事件不好捕获,如先最小化在关闭等。
2.一个账号登进去了,再用这个账号登进去,前一个session失效,提示账户已经在别处登录。
缺点:如果也是非法关闭。用户有没有重新登录,session没有释放,在线统计不太对,有点就是不影响用户使用,可以继续登进去使用。
所以选择第二种:
struts2 
1.action里的某个方法,
public void totalcount()
{        httpservletrequest request = servletactioncontext.getrequest();
   httpsession session = request.getsession();
                     //就是获取用户名,因为是struts2可以这样获取
   string username = user.getfirstname();
// 把用户名放入在线列表
    map<string,string> onlineuserlist = (map<string,string>) servletactioncontext.getservletcontext().getattribute("onlineuserlist");
    // 第一次使用前,需要初始化
    if (onlineuserlist == null) {
        onlineuserlist = new hashmap<string,string>();
       
    }
//用户名一样,sessionid不一样,所以是二次登录       if(onlineuserlist.containskey(username) &amp;&amp; !(onlineuserlist.get(username).equals(session.getid())) )
   
    {  
    onlineuserlist.remove(username);

   
    }
    session.setattribute("username", username);
    onlineuserlist.put(username,session.getid());
   
    servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
 

}
2.listener,销毁session,只要调用session.invalidate()就会执行
public class userlistener implements httpsessionlistener {

    public void sessioncreated(httpsessionevent event) {
   
   
    }
    @suppresswarnings("unchecked")
    public void sessiondestroyed(httpsessionevent event) {
        httpsession session = event.getsession();   
       
        // 取得登录的用户名
            string username = (string) session.getattribute("username");
            servletcontext application = session.getservletcontext();
            system.out.println("listener开始");
            system.out.println("sessionid:"+session.getid());
            system.out.println("username:"+username);
            // 获取在线列表
            map<string,string> onlineuserlist = (map<string,string>) application.getattribute("onlineuserlist");
            //session超时删除用户,重复登录登录时已删除,不再删了
            if(onlineuserlist.containskey(username) &amp;&amp; (onlineuserlist.get(username).equals(session.getid())) )
            {
            onlineuserlist.remove(username);
            servletactioncontext.getservletcontext().setattribute("onlineuserlist", onlineuserlist);
            }
            system.out.println("onlineuserlist:"+onlineuserlist);
            system.out.println("listener结束");

    }

}
3.filter
public class userfilter implements filter {
public void init(filterconfig config) throws servletexception {
}

public void destroy() {
}

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

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

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

} else {
// 用于记录状态
boolean temp = false;
system.out.println(sessionlist.containskey(username));
system.out.println(sessionlist.get(username));
system.out.println(sessionlist.get(username)
.equals(session.getid()));
if (sessionlist.containskey(username)
&amp;&amp; sessionlist.get(username).equals(session.getid())) {
// session值与当前id匹配,说明同一个用户
temp = true;

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

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

}

}

}

web.xml的配置。
filter放在struts2拦截器的前面
<filter>
<filter-name>userfilter</filter-name>
<filter-class>
com.test.action.user.userfilter
</filter-class>
</filter>
   

<filter-mapping>
<filter-name>userfilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
listener的配置
调用session.invalide()的方法会被监听到,销毁session
<listener>                       
  <listener-class>com.test.action.user.userlistener</listener-class>
</listener>

大概实现了,可能考虑不周:如果有问题共同探讨。
0
3
分享到:
评论

相关推荐

    java统计在线人数,重复登录

    统计在线人数,是否登录过,小例子,用jsp/HttpSessionBindingListener实现 ,有需要的请猛击下载,无源码。要源码,地址:http://download.csdn.net/source/1845699

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

    - 为了防止用户在同一个浏览器使用多个tab或窗口时导致在线人数统计重复计数,可以将用户唯一标识符(如session中的某个属性)存储到一个HashSet集合中。在`sessionDestroyed`方法中,可以从HashSet中移除对应的...

    统计在线人数Appliaction

    在IT行业中,统计在线人数是一项常见的需求,尤其对于开发网络应用和服务的团队而言。这个"统计在线人数Appliaction"可能是一个专为此目的设计的软件工具或应用程序。下面我们将详细探讨统计在线人数的方法以及可能...

    负载均衡情况下解决账号重复登录以及在线人数统计解决方案

    1、在负载均衡以及单服务器部署模式下面解决同一个账户不能重复登录问题,如果重复登录则之前会话失效. 2、只提供负载均衡情况下避免账户重新登录解决方案。在线人数统计也可以参考这种方法实现,未做具体描述。

    在线人数统计并写入数据库

    在线人数统计并写入数据库是一项常见的任务,尤其在构建网站或网络应用时,它对于分析用户行为、评估网站性能和制定市场策略至关重要。这个项目显然涉及到实时数据收集、处理和持久化存储,以下将详细解释相关知识点...

    在线人数统计程序.rar

    在线人数统计程序是一种常见的Web应用程序功能,用于估算和记录网站同时活跃用户数量。这个"在线人数统计程序.rar"是一个特别设计的解决方案,它无需依赖Global.asa文件,这对于那些不支持或限制使用此文件的免费Web...

    统计网站访问在线人数

    本项目“统计网站访问在线人数”利用ASP.NET(C#)作为后端开发语言,搭配SQL Server 2000作为数据库管理系统,旨在实现这一功能。下面我们将详细探讨这一技术实现过程。 1. **ASP.NET框架**:ASP.NET是由微软开发...

    准确在线人数统计准确在线人数统计

    在线人数统计是网络服务运营中的重要指标,它可以帮助管理者了解网站、应用或游戏等平台的实时活跃用户数量,为优化用户体验、制定营销策略提供数据支持。准确的在线人数统计不仅涉及技术实现,还涵盖多种技术和策略...

    JSP中的在线人数统计

    ### JSP中的在线人数统计 #### 一、引言 在Web开发中,统计在线人数是一种常见的需求,尤其是在社交网络、论坛或者任何需要实时显示在线用户数量的应用场景中尤为重要。本文将详细介绍如何在JSP(JavaServer Pages...

    .net的webform统计在线人数

    - 通过IP地址、设备标识等多维度数据,进一步细化在线人数的统计,比如区分独立访客和重复访问。 综上所述,在.NET的WebForm中统计在线人数主要依赖于Session管理和适当的数据存储。通过正确地管理Session,我们...

    .net C# 通过session控制重复登录及在线用户统计

    在.NET C#开发中,`Session`是一种常用的技术,用于在服务器端存储用户特定的数据,以便在用户与网站交互期间保持状态。...通过合理设计和实现,我们可以创建一个既能有效控制用户登录,又能准确统计在线人数的系统。

    一个网页计算器,统计人数

    此外,考虑到统计人数,可能还会涉及防止重复计数的机制,例如IP检测或Cookie追踪。 总之,创建一个能统计人数的网页计算器涉及到HTML、CSS和JavaScript的综合运用,需要理解这些技术如何协同工作以实现动态的、...

    PHP利用IP统计访问人数,防刷新

    首先,我们需要理解如何统计访问人数。在PHP中,我们可以创建一个简单的计数器,通常存储在数据库或文本文件中。每当有新的用户访问时,我们检查他们的IP地址,如果这是他们第一次访问,计数器加一。IP地址是识别...

    选课系统VB实例统计人数

    【选课系统VB实例统计人数】是一个基于Visual Basic(VB)开发的应用程序,主要用于辅助学习委员在选课过程中统计订购教材的人数。VB是一种流行的、面向对象的编程语言,尤其适用于开发Windows桌面应用程序。这个...

    网站访问人数统计

    网站访问人数统计是Web分析中的基础任务,它对于评估网站流量、优化用户体验和制定营销策略至关重要。在这个场景中,你创建了一个产品页面,并在门户网站上投放了链接,目的是吸引潜在客户并了解页面的访问情况。...

    .Net实现在线人数统计和对数据库中表的操作

    本项目聚焦于在线人数统计以及对数据库中表的CRUD(创建、读取、更新、删除)操作,这些都是Web开发中的核心功能。 首先,我们要理解在线人数统计的基本原理。在Asp.Net中,可以通过跟踪会话(Session)或Cookie来...

    VC++各分数段学生人数统计

    在这个“VC++各分数段学生人数统计”的项目中,我们的目标是利用C++编程语言,针对学生的分数数据,计算每个分数段内的人数,这些分数段通常包括:不及格(分)、及格(60~70分)、良好(70~80分)、优秀(80~90分)...

    精确的在线人数统计,记录客户端的ip等等........

    在IT行业中,实时在线人数统计是一项重要的任务,它可以帮助网站管理员了解其服务的实时使用情况,以便优化资源分配、提升用户体验或进行业务分析。而记录客户端的IP地址则提供了更深入的数据,帮助追踪用户行为、...

    网站在线ip统计 -ASP源码.zip

    4. **页面刷新和Ajax**:考虑到用户可能通过浏览器刷新页面,为了避免重复计数,可以结合Ajax技术实现无刷新更新在线人数,只在真正的新用户访问时才更新Session和Application。 【文件"内容来自存起来软件站...

    php网站统计人数的代码

    【PHP网站统计人数的代码详解】 在Web开发中,统计网站访问人数是一项基本的需求,它可以帮助网站管理员了解网站的活跃度和用户流量。PHP作为最流行的服务器端脚本语言之一,常常被用来实现这一功能。这里我们将...

Global site tag (gtag.js) - Google Analytics