本文主要介绍了java中使用session监听实现同帐号登录限制、登录人数限制,具体代码如下:

问题域:

1、同帐号登录:若此帐号已登录,不可再次登录(与QQ模式相反)。

2、登录人数限制,超过、已达人数限制则提示:系统繁忙,稍后再试。

解决思路:使用HttpSessionAttributeListener监听器(虽然我同时使用了HttpSessionListener不过感觉不好操作)

知识储备:HttpSessionAttributeListener中有attributeAdd、attributeRemove、attributeReplace3个方法。

对session的setAttribute、removeAttribute将触发attributeAdd、attributeRemove方法,对同一个session的同一个attribute进行重复设置将触发attributeReplace方法。

HttpSessionListener不好操作的原因:只要访问jsp页面便会创建session(访问html并不会创建session,在server端,如servlet中调用HttpServletRequest.getSession(true)才会创建),jsp是动态页,本质就是个servlet。我的login.jsp显然是个jsp,当我在监听器中invalidate一个session,返回登录页,马上就又创建了一个session。这是我感觉不清楚的地方,功夫没到家。

具体实现:

监听器代码

public class OnlineListener implements HttpSessionListener,

HttpSessionAttributeListener {

private static List sessions;

static int delS = -1;

static boolean flag = false;

static {

if (sessions == null) {

sessions = Collections

.synchronizedList(new ArrayList());

}

}

public void sessionCreated(HttpSessionEvent hse) {

System.out.println(hse.getSession() + "-" + new Date());

System.out.println(hse.getSession() + "-" + new Date());

}

public void sessionDestroyed(HttpSessionEvent hse) {

System.out.println("-------------sessionDestroyed()-----------");

System.out.println(hse.getSession() + " "

+ new Date(hse.getSession().getLastAccessedTime()));

System.out.println(hse.getSession() + " " + new Date());

}

public void attributeAdded(HttpSessionBindingEvent e) {

System.out.println("-------------*start added*-----------------------"

+ sessions.size());

HttpSession session = e.getSession();

ActionContext ctx = ActionContext.getContext();

boolean newOne = true;

String attrName = e.getName();

// 登录

if (attrName.equals(Constant.USER_NAME)) {

// 检查登录人数

if (sessions.size() >= Constant.USER_LIMIT) {

newOne = false;

ctx.put("timeoutMSG", "serverBusy");

}

String nowUser = (String) e.getValue();

// 遍历所有session,检查是否已经登录,若是则提示已经登录

for (int i = sessions.size() - 1; i >= 0; i--) {

SessionAndUser tem = sessions.get(i);

if (tem.getUserName().equals(nowUser)) {

newOne = false;

ctx.put("timeoutMSG", "beenLoged");// tem.getSession().invalidate();//

// 同账号顶替登录,自动调用remove

break;

}

}

// 新登录帐号添加进账户维护列表

if (newOne) {

SessionAndUser sau = new SessionAndUser();

sau.setUserName(nowUser);

sau.setSession(session);

sau.setSid(session.getId());

sessions.add(sau);

}

}

}

public void attributeRemoved(HttpSessionBindingEvent e)

throws IllegalStateException {

HttpSession session = e.getSession();

System.out

.println("-------------*start Removed*-----------------------"

+ sessions.size());

if (delS > -1) {

if (flag) {

sessions.remove(delS);

flag = false;

}

} else {

// 登录

String attrName = e.getName();

if (attrName.equals(Constant.USER_NAME)) {

String nowUser = (String) e.getValue();

// 遍历所有session

for (int i = sessions.size() - 1; i >= 0; i--) {

SessionAndUser tem = sessions.get(i);

if (tem.getUserName().equals(nowUser)) {

sessions.remove(i);

break;

}

}

}

}

}

public void attributeReplaced(HttpSessionBindingEvent e) {

HttpSession session = e.getSession();

System.out

.println("-------------*start replace*-----------------------"

+ sessions.size());

String attrName = e.getName();

delS = -1;

// 登录

if (attrName.equals(Constant.USER_NAME)) {

// User nowUser = (User) e.getValue();//old value

String nowUser = (String) session.getAttribute(Constant.USER_NAME);// 当前session中的user

// 遍历所有session

for (int i = sessions.size() - 1; i >= 0; i--) {

SessionAndUser tem = sessions.get(i);

if (tem.getUserName().equals(nowUser)

&& !tem.getSid().equals(session.getId())) {

System.out.println("Remove:invalidate 1!");

delS = i;

flag = true;

} else if (tem.getSid().equals(session.getId())) {

tem.setUserName(nowUser);

}

}

if (delS != -1) {

sessions.get(delS).getSession().invalidate();// 失效时自动调用了remove方法。也就会把它从sessions中移除了

}

}

}

}

代码主要思路是定义一个静态List存放session和帐号名称。

登录的Action中获得监听器返回值并处理的代码

session.setAttribute(Constant.USER_NAME, operator.getUsername());

ActionContext ctx = ActionContext.getContext();

if("serverBusy".equals(ctx.get("timeoutMSG"))){

ctx.put("timeoutMSG", "服务器繁忙,请稍后再试");

return "jump";

}

if("beenLoged".equals(ctx.get("timeoutMSG"))){

ctx.put("timeoutMSG", "此账户在别处登录");

return "jump";

}

页面捕获提示信息代码

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java session 数量_java中使用session监听实现同帐号登录限制、登录人数限制相关推荐

  1. java中事件监听_Java中的事件监听机制

    鼠标事件监听机制的三个方面: 1.事件源对象: 事件源对象就是能够产生动作的对象.在Java语言中所有的容器组件和元素组件都是事件监听中的事件源对象.Java中根据事件的动作来区分不同的事件源对象,动 ...

  2. Java语言学习--Swing中Button事件监听

    1 前言 今天在使用Java Swing中的JButton的事件触发机制时遇到了许多问题,简单的了解了一下. 2 事件监听机制 事件监听的机制如下图所示分析. 3 代码分析 3.1 分步解析 1.事件 ...

  3. java jtextfield 密码_java中的文本输入框JTextField与JTextArea、密码输入框

    文本输入框包括两种,单行文本输入框(JTextField) 和多行文本输入框 (JTextArea).密码输入框则只有一种(JPasswordField).JPasswordField 是 JText ...

  4. python监听鼠标事件_Python中使用PyHook监听鼠标和键盘事件实例

    Python 中使用 PyHook 监听鼠标和键盘事件实例 PyHook 是一个基于 Python 的"钩子"库,主要用于监 听当前电脑上鼠标和键盘的事件.这个库依赖于另一个 Py ...

  5. vue中使用watch监听$route 无效问题

    vue 中使用watch监听$route失效问题!在watch里面监听$route变化,发现并没有监听到. 路由: {name: 'secondUser ',component: secondUser ...

  6. Vue 中使用watch监听$route 无效问题

    Vue 中使用watch监听$route失效问题! 今天在项目操作中发现一个问题,在watch里面监听$route变化,发现并没有监听到,查阅了一些资料最终解决,现写出与大家共同分享,也忘出现此问题的 ...

  7. Vue中数组变动监听

    Vue中数组变动监听 Vue的通过数据劫持的方式实现数据的双向绑定,即使用Object.defineProperty()来实现对属性的劫持,但是Object.defineProperty()中的set ...

  8. Vue父组件传子组件数据中,Vue监听不到数据改变

    Vue父组件传子组件数据中,Vue监听不到数据改变 官方文档说明(引用来自官网) 检测变化的注意事项 由于 JavaScript 的限制,Vue 不能检测数组和对象的变化.尽管如此我们还是有一些办法来 ...

  9. jsp java代码取session_jsp中的session在java文件中取到

    jsp页面调用.mxml页面,然后.mxml页面调用后台java文件,在后台java文件中通过session 可以取道jsp页面中的session的值. String path = request.g ...

最新文章

  1. mysql效率优化_MySQL性能优化的最佳12条经验
  2. 再次学习基础爬虫,爬取大学排名。
  3. 面对不同用户,数据中心如何将服务做到极致
  4. 通过Spring集成进行消息处理
  5. NOIP2014 uoj20解方程 数论(同余)
  6. ionic app 优化三件套,让其更贴近原生app
  7. 本周任务asp.net 1.1老系统移植升级到asp.net 2.0,又是一个浩大的工程啊?
  8. Sendmail邮件服务器搭建与配置笔记
  9. APP设计灵感|仪表盘这样设计,所有信息一目了然!
  10. 即时低码数据库Web应用-ASP.NET Core 3.1单页应用(SPA)
  11. 守护进程和inetd超级服务器
  12. ERP项目实施记录05
  13. 谁在使用我的网站——用户行为分析
  14. windows下的gcc编译器
  15. 超级简单Python学生信息管理系统设计与实现.zip(论文+项目源码+使用说明书)
  16. serviceWorker 服务器与浏览器之间的代理
  17. 计算机专业如何推广太极拳,太极拳在年轻人群体中推广的怎么样不得不说挺吃惊...
  18. VTK图像处理之访问图像像素值
  19. 基于粒子群算法和遗传算法优化的高速列车横向悬挂模糊PID控制
  20. TCP三次握手以及与UDP的区别

热门文章

  1. Python如何引用豆瓣api镜像地址
  2. Python连接Mysql数据库入门
  3. 输出等边三角形php,php打印三角星星方法实列
  4. matlab 自再现模,平行平面腔自再现模FoxLi数值迭代解法及MATLAB实现
  5. PHP中strtotime函数有范围吗,PHP中使用strtotime函数注意事项
  6. php怎么做免登录,php---一周内免登录
  7. Android开发之开发工具之Android Studio出现全屏的解决办法
  8. python循环数组判断,python的数据类型、数组、条件判断、循环的基础知识
  9. python123 helloworld_python入门
  10. 面向对象-多态的实现