在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制。

具体一点就是:

1、在同一台电脑上一次只允许有一个用户登录系统;

2、一个用户在同一时间只允许在一个客户端登录。

我最近做的一个系统就遇到了这样的问题,本来系统已经开发完成了,但是安全测评没有通过,就是因为没有做这两个限制。怎么来做这样的限制呢?我在网上找了很久,发现问这个问题的人很多,但是没有找到特别清楚的答案。后来自己摸索着,看了一些书,终于找到解决办法了。

要解决这个问题实际上不难,对于高手来说可能都懒得去说了,但是对于不熟悉web编程的人来说可能会困扰很久。下面我把我的解决办法说出来,供大家参考!

先介绍一下我那个系统的背景:j2ee,tomcat,没有用cookie。

首先确定解决这两个问题的基本思路:

1、要解决同一台电脑上只允许有一个用户登录系统,只有一个办法。监视每一个连接的来源,如果发现有一个新的连接与某个已经存在的连接来自同一台电脑,则终止其中的一个(当然,也可以提醒用户,让他自己决定终止哪一个)。

2、要禁止一个用户账号同时在不同的客户端登录,只有监视每一个连接的用户账号,如果发现一个新连接的用户账号跟某个已经存在的连接的用户账号相同,则自动将前一个终止(同样,也可以让用户自己决定终止哪一个)。

确定了基本思路以后,就要找具体办法了。我最初的想法是在数据库建立一张表,存放已登录用户的用户名、物理地址、Session id等信息。当用户登录时,与这张表里面的数据进行匹配,如果发现物理地址与表中的某条记录相同,则表示是同一台客户端上有多个用户再登录,如果发现正在登录的用户的用户名与表中已有记录相同而主机名不同,则表示是一个账号同时在不同的客户端使用。

相信很多一开始遇到这个问题的人都会考虑这种解决办法。但是这种办法有很多问题,最主要的问题有两个:第一是效率,每一次都要从数据库里面取数据进行匹配。第二是用户退出时需要删除表中的记录,而当用户非正常退出时,很难及时监测(后来发现其实有办法监测)。

后来在网上的某个帖子里面看到一位大侠提到用监听器,只是那位大侠说的太含糊,照他说的办法根本无法解决。虽然无法解决,但是提供了一个思路。于是我找了一本书,仔细看了其中关于监听器的部分。解决办法就在其中了!!!

监听器的详细介绍见我的下一篇博文,这里先把解决办法告诉大家:

监听器可以监听Session及其所包含的属性,即Attribute。

所以我们要做的就是:

1、建立一个监听器,实现HttpSessionAttributeListener接口,监听每一个Attribute的增加、编辑、删除事件。监听器中还要建立一个map,将所有的session放入这个map中。

2、在用户登录时将用户名、物理地址、Session id存到Session中去(可以建立一个用户登录地址数据传输对象,我建立了一个UserSessionAdd类,里面包含username,macAdd,sessionId三个属性,用户登录时将这个数据对象初始化,并存入到session中)。

3、每个新会话开启时,在监听器中对Session包含的属性进行判断,如果新增的属性与map中已有session的用户登录地址数据相同,则表示新会话与我们要做的两个限制相冲突。将与之冲突的会话提取出来,销毁掉!

这么说,还是不够清楚,下面看代码:

Web.xml文件:
03.<listener>
04.
05.       <listener-class>监听器类的路径,如:com.web.MyListener</ listener-class >
06.
07.</listener>

用户登录地址数据传输对象:

01.public class UserSessionAdd {
02.
03.
04.private Stringadd;
05.
06.
07.private Stringsessid;
08.
09.
10.private String username
11.
12.public String getUsername(){
13.
14.return username
15.
16.}
17.
18.Public void setUsername(String username){
19.
20.       this.username=username;
21.
22.    }
23.
24.public String getIp() {
25.
26.returnadd;
27.
28.}
29.
30.publicvoid setAdd(String add) {
31.
32.this.add = add;
33.
34.}
35.
36.public String getSessid() {
37.
38.returnsessid;
39.
40.}
41.
42.publicvoid setSessid(String sessid) {
43.
44.this.sessid = sessid;
45.
46.}
47.
48.
49.}

用户登录的代码:

03.String userHost = request.getRemoteHost();
04.
05.String sessionId = request.getSession().getId();
06.
07.UserSessionAdd usa = new UserSessionAdd();
08.
09.usa.setUsername(username);
10.
11.usa.setSessid(sessionId);
12.
13.usa.setAdd(userHost);
14.
15.request.getSession().setAttribute(“usa”,usa);

监听器代码:

01.publicclass MyListenerimplementsHttpSessionAttributeListener{
02.
03.
04.Map<String, HttpSession> map =new HashMap<String, HttpSession>();
05.
06.publicvoidattributeAdded(HttpSessionBindingEvent event) {
07.
08.String name = event.getName();
09.
10.if(name.equals("usa")){
11.
12.UserSessionAdd usa = (UserSessionAdd)event.getValue();
13.
14.if(map.get(usa.getAdd())!=null){
15.
16.HttpSession sess = map.get(usa.getAdd());
17.
18.UserSessionAdd usa1 = (UserSessionAdd)sess.getAttribute("usa");
19.
20.sess.removeAttribute("usa");
21.
22.sess.invalidate();
23.
24.}
25.
26.map.put(usa.getAdd(), event.getSession());
27.
28.}
29.
30.}
31.
32.
33.publicvoidattributeRemoved(HttpSessionBindingEvent event) {
34.
35.String name = event.getName();
36.
37.if(name.equals("usa")){
38.
39.UserSessionAdd usa = (UserSessionAdd)event.getValue();
40.
41.map.remove(usa.getAdd());
42.
43.}
44.
45.}
46.
47.
48.publicvoidattributeReplaced(HttpSessionBindingEvent event) {
49.
50.// TODO Auto-generated method stub
51.
52.````
53.
54.}
55.
56.}

转自:http://blog.csdn.net/yutan_313/article/details/5405934

限制在同一台电脑上只允许有一个用户登录系统相关推荐

  1. java限制在同一台电脑上只允许有一个用户登录系统

    在web应用系统中,出于安全性考虑,经常需要对同一客户端登录的用户数量和一个客户同时在多个客户端登陆进行限制. 具体一点就是: 1.在同一台电脑上一次只允许有一个用户登录系统: 2.一个用户在同一时间 ...

  2. 限制在同一台电脑上只允许有一个用户登录

    文章目录 1. html 部分 2. js部分 3. 拦截器部分 4. 认证授权部分 5. 控制层部分 6. 工具类 实现流程: 1.从reqest域中获取现在登陆的新sessionId 2.根据登陆 ...

  3. 软件双开限定-一台电脑上只允许开一个软件

    只要是创建进程互斥锁 //** 软件双开限定HANDLE hMutex = CreateMutex(NULL, false, "Process");if(GetLastError( ...

  4. 在一台电脑上使用两个github账号

    问题描述: 我公司有一个github账号,每天工作把代码传上去,我觉得代码写的好,我同时想上传到自己的github账号上面去,但是目前只有一台电脑,如何在一台电脑上面进行设置,使这一台电脑可以同时上传 ...

  5. 同个网络找不到计算机打印机共享,我已经在一台电脑上设置了打印机共享,为什么另一台电脑输入打印机电脑的IP显示找不到文件...

    我已经在一台电脑上设置了打印机共享,为什么另一台电脑输入打印机电脑的IP显示找不到文件以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...

  6. 在同一台电脑上同时安装Python2和Python3

    目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3,取决于当前要使用的库.框架支持哪个版本. 例如:HTM ...

  7. 两个计算机系统安装,如何在一台电脑上同时重装两个系统|戴尔电脑怎么安装两个系统...

    有些用户,想用win10的同时,又想用win7,所以需要安装双系统.这篇文章就是白云一键重装系统给这类用户带来的方法教程,其实原理很简单,同一块硬盘,可以分成多个分区,然后再在上面分别安装系统即可. ...

  8. 电脑同时安装python2和3_一台电脑上同时安装python2和python3

    被python2的编码问题整的快晕了,python3对编码问题解决的不错 所以想安装下python3,但由于目前企业大多还是用python2,所以不想卸载2,让python2和python3共存. 本 ...

  9. 电脑可以同时装python2和3吗_在同一台电脑上同时安装Python2和Python3-Go语言中文社区...

    在同一台电脑上同时安装Python2和Python3 目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3, ...

最新文章

  1. 使用Callable来获取数组的最大值
  2. 红帽企业虚拟化平台RHEV中WINDOWS 虚拟机如何安装 GUEST代理和驱动
  3. Python优雅地可视化数据
  4. 刀剑神域服务器维护到什么时候,刀剑神域黑衣剑士王牌维护结束时间 服务器维护进不去怎么办...
  5. oracle 报错06502,求助!!ORA-06502错误
  6. UI线程安全 runOnUiThread 和 Handler 一般用法
  7. R语言-解决for modifying Try removing ‘00LOCK’的问题
  8. 经典.net混淆器 Confuser EX 2.0 使用介绍及配置 2022
  9. 世界杯花样营销:争夺32亿人眼球中看到三大趋势
  10. Knowledge Graph Embedding: A Survey of Approaches and Applications【翻译】
  11. 小米发明“永动机”:走路即可为智能设备充电
  12. 当华为云WeLink遇上华为企业智慧屏,端云协同视频会议究竟有多神奇
  13. 英语进阶系列-A05-英语升级练习三
  14. vscode编辑如何保存时自动校准eslint规范
  15. 如何阅读一本书——“功利性”阅读法
  16. java 立刻回收_如何实现Java程序自动回收垃圾
  17. 触屏型测控电路:串口助手网络ping包 带笔划输入法 硬件终结版
  18. 怎样绕过计算机密码,如何利用U盘绕过电脑开机密码
  19. python计算存款复利计算器_GitHub - dxcv/Options-Calculator: 期权价格计算器——金融工程第二次展示...
  20. 基金投资建议及推荐原因

热门文章

  1. python语音分割_用7行Python代码构建自己的有声读物
  2. 解决asterisk sip呼叫 488 no acceptable here
  3. WinCE6.0中应用程序如何直接访问物理空间
  4. java递增_java-8 – 如何按组递增
  5. java种子填充_种子填充实例运行出问题
  6. 人体轮廓_女性人体油画轮廓柔和生动,优美动人,你喜欢吗?
  7. python把矩阵堆叠成大矩阵_python numpy 矩阵堆叠实例
  8. REVERSE-PRACTICE-CTFSHOW-1
  9. 【CodeForces - 1150A】Stock Arbitraging (贪心,水题)
  10. 【牛客 - 318M】被打脸的潇洒哥(几何问题,水题,结论,知识点)