我使用的是SSH2框架,做安全测试需要限制:1.单个用户的多重并发会话限制 2. 限制单客户端同时登录多个用户 。这两个内容,没有采用在web.xml中配置过滤器的方式,我处理的方式是如果一个用户在第二台电脑上登录了就踢掉上一台电脑登录的用户,如果同一个台电脑有第二个用户登录 ,就踢掉之前登录的帐号。

所以,是在登录的方法中做的处理。

在登录方法中加入如下两行语句,作为程序的入口:

SessionListener.isAlreadyEnter(getHttpRequest().getSession(),this.getUserCode(),loginUser);

getHttpRequest().getSession().setAttribute("isLoginIn", "LoginIn");

在SessionListener类中做相关的踢出处理:

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import javax.servlet.ServletRequestEvent;

import javax.servlet.ServletRequestListener;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpSession;

import javax.servlet.http.HttpSessionAttributeListener;

import javax.servlet.http.HttpSessionBindingEvent;

import javax.servlet.http.HttpSessionEvent;

import javax.servlet.http.HttpSessionListener;

import org.apache.struts2.ServletActionContext;

import com.hhwy.iepip.framework.message.Message;

import com.opensymphony.xwork2.ActionContext;

public class SessionListener implements HttpSessionListener,ServletRequestListener,HttpSessionAttributeListener{

public static Map sessionMap = new HashMap();

public static Map sessionMap1 = new HashMap();

private static Boolean onlyOne = Boolean.valueOf(Message.getMessage("session.onlyone"));

private HttpServletRequest request ;

/**获取request对象*/

public void requestInitialized(ServletRequestEvent event) {

request = (HttpServletRequest)event.getServletRequest();

}

/**以下是实现HttpSessionListener中的方法:该方法登录与否都会执行**/

public void sessionCreated(HttpSessionEvent se){

}

/**以下是实现HttpSessionListener中的方法**/

public void sessionDestroyed(HttpSessionEvent se){

hUserName.remove(se.getSession().getId());

UserObject.remove(se.getSession().getId());

if(sessionMap!=null){

sessionMap.remove(se.getSession().getId());

}

if(sessionMap1!=null){

sessionMap1.remove(se.getSession().getId());

}

}

/**

* isAlreadyEnter-用于判断用户是否已经登录以及相应的处理方法

*

*/

public static boolean isAlreadyEnter(HttpSession session,String sUserName,LoginUserInfo loginTriggers){

boolean flag = false;

return flag;

}

/**

* 此方法,可以在登录时候添加一个session 用以判断是否已经登录,然后再进行登录人登录控制

*/

public void attributeAdded(HttpSessionBindingEvent event) {

//如果只允许一个账号一处登陆,单台客户端电脑只允许一个用户登录

if(onlyOne.booleanValue()){

String name = event.getName();

if(name.equals("isLoginIn")){

// 单台客户端电脑只允许一个用户登录

String ipAddr = this.getIpAddr(request);

//如果原先已登录,则踢出原先登陆的

if(sessionMap1.containsKey(ipAddr) ){

try{

sessionMap1.get(ipAddr).invalidate();

}catch(Exception e){}

sessionMap1.remove(ipAddr);

}

if(ipAddr != null && event.getSession().isNew())

sessionMap1.put(ipAddr, event.getSession());

//只允许一个账号一个客户端登陆

String userName= getUserName(event);

if(sessionMap.containsKey(userName) ){

try{

sessionMap.get(userName).invalidate();

}catch(Exception e){}

sessionMap.remove(userName);

}

if(userName != null && event.getSession().isNew())

sessionMap.put(userName, event.getSession());

}

}

}

public static String getIpAddr(HttpServletRequest request) {

String ip = request.getHeader("x-forwarded-for");

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getHeader("WL-Proxy-Client-IP");

}

if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {

ip = request.getRemoteAddr();

}

return ip;

}

/*获取session中存储的用户名*/

private String getUserName(HttpSessionBindingEvent se) {

String userName = null;

return userName;

}

public void attributeRemoved(HttpSessionBindingEvent event) {

// TODO Auto-generated method stub

}

public void attributeReplaced(HttpSessionBindingEvent arg0) {

// TODO Auto-generated method stub

}

public void requestDestroyed(ServletRequestEvent arg0) {

// TODO Auto-generated method stub

}

}

java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...相关推荐

  1. tcp并发服务器_在Go中构建并发TCP服务器

    tcp并发服务器 本文是Mihalis Tsoukalos的"围棋"系列的一部分. 阅读第1部分: 在Go中创建随机,安全的密码 . TCP和UDP服务器无处不在,通过TCP / ...

  2. 常见的并发模型_两个常见的并发错误

    常见的并发模型 作为Baeldung的编辑,我很高兴与一位作者一起撰写有关Java通用并发陷阱的文章. 这是一本不错的书,但是假设开发人员具有一定的能力. 我已经看到了几件即时并发失败的事情. 它们很 ...

  3. mysql 高并发 优惠券_转 mysql处理高并发,防止库存超卖

    今天王总又给我们上了一课,其实mysql处理高并发,防止库存超卖的问题,在去年的时候,王总已经提过:但是很可惜,即使当时大家都听懂了,但是在现实开发中,还是没这方面的意识.今天就我的一些理解,整理一下 ...

  4. java做h5小游戏服务端_神藏西游H5游戏源码服务端+客户端+搭建教程

    源码预览 源码介绍 教程如下: 1.cd / 把下载好的文件传到服务器根目录下面 2.打开Xshell 安装java 输入 sh sd 回车 输入1 回车 3.安装宝塔 输入 sh sd 回车 输入2 ...

  5. mysql并发错误_又谈php+mysql并发数据出错问题

    最近,项目中的所有crond定时尽量取消,改成触发式. 比如每日6点清理数据. 原来的逻辑,写一个crond定时搞定 现在改为触发式 6点之后第一个玩家/用户  进入,才开始清理数据. 出现了一个问题 ...

  6. 计算机登录界面怎么切换用户名,win10系统登录界面切换用户的方法

    在使用win10系统的时候,许多用户为了方便使用会在电脑中创建多个用户,而在登录界面的时候,会显示某个用户,但是想要切换其他用户的话要怎么操作呢,下面小编就给大家讲解一下win10系统登录界面切换用户 ...

  7. 单商户商城系统功能拆解21—用户概况与管理

    单商户商城系统,也称为B2C自营电商模式单店商城系统.可以快速帮助个人.机构和企业搭建自己的私域交易线上商城. 单商户商城系统完美契合私域流量变现闭环交易使用.通常拥有丰富的营销玩法,例如拼团,秒杀, ...

  8. Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析

    文章目录 Pre 小Demo 类图结构 CyclicBarrier核心方法源码解读 int await() int await(long timeout, TimeUnit unit) int dow ...

  9. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析

    文章目录 概述 小Demo 源码分析 重要的方法 long sum() reset sumThenReset longValue() add(long x) longAccumulate(long x ...

最新文章

  1. 漫画:什么是公有云、私有云和混合云?
  2. 自定义一个安全的rm指令
  3. mysql取出数据外键_mysql数据表有外键,应注意的几点(目前学习所获得的经验)...
  4. PHP编程最快明白 by www.kuphp.com 案例实战zencart1.38a支付模块简化Fast and Easy Checkout配置...
  5. JQuery的$和其它JS发生冲突的快速解决方法
  6. (原创)SpringBoot入门
  7. Neumorphism新拟物化控件设计灵感
  8. [数位DP]JZOJ 3363 Number
  9. 华为 seco pc版下载_狼人之间电脑版下载-狼人之间pc版下载v1.8 官方版
  10. 多数据源切换(拦截器)
  11. halcon学习之图像增强、平滑和去噪
  12. [读书笔记] 机器学习 (一)绪论
  13. 对软件工程Alpha迭代的反思与总结
  14. 突破软件测试系统性能瓶颈 LoadRunner实战演讲
  15. 『杭电1891』Tough Water Level
  16. ROS教程(四):RVIZ使用教程(详细图文)
  17. 泛函分析复习笔记(二)线性算子与线性泛函
  18. python 方波信号_python实现周期方波信号频谱图
  19. 全息投影是计算机技术吗,全息投影技术在使用过程中要注意哪些问题?
  20. QT界面优化---反走样

热门文章

  1. 针对接口编程,不要针对实现编程
  2. XAF Study Recources
  3. [算法模版]Link-Cut-Tree
  4. 结合源码分析 bubble 使用注意事项
  5. 机械硬盘提示操作无法完成,因为磁盘管理控制台视图不是最新状态要如何办啊...
  6. 四大算法解决最短路径问题(Dijkstra+Bellman-ford+SPFA+Floyd)
  7. 论一只爬虫的自我修养
  8. 为什么EXE不能超过4GB
  9. sqlserver 事务例子
  10. ASP.NET中常用功能代码总结(3)——上传图片到数据库