引用别人的回答:首先, 你在登陆的时候应该把用户名存入到session中去, 然后用Web自带框架中, 有一个HttpSessionListener接口, 还有HttpSessionAttributeListener接口, 他们两个有一些需要实现的方法
HttpSessionListener两个:sessionCreated, sessionDestroyed
sessionCreated不用管, 扔在那儿就行了.
主要是sessionDestroyed, 他是在你的Session失效或者过期的时候调用的这个方法,
HttpSessionAttributeListener三个:attributeAdded, attributeRemoved, attributeReplaced
attributeAdded是当执行setAttribute的时候, 当这个属性本来不存在于Session中时, 调用这个方法.
attributeRemoved是当执行removeAttribute时调用的方法.
attributeReplaced是当执行setAttribute时 ,如果这个属性已经存在, 覆盖属性的时候, 调用这个方法
这样, 我就可以在这个Listener中声明一个全局的Map, 用来保存当前已经登录的用户, 当用户登录的时候, 会往session中保存用户名,
这样就触发了attributeAdded或attributeReplaced方法, 这时候把相应的用户put入Map中去, key就用session的引用就行, 也就是Session本身,
value保存登陆用户的Name, 当用户登出或者Session失效的时候, 触发方法attributeRemoved和是sessionDestroyed, 根据Session ,
把相应的用户移出Map, 这样, 就首先做到了保存在线用户的工作.
然后就是登陆判断, 可以在这个SessionListener中写一个静态的方法, 传递进来一个用户名name , 然后遍历Map判断这个用户名是否存在, 存在就返回true ,不存在就返回false, 然后在登陆的servlet或者Action中控制一下, 就能达到重复登录限制的效果了.
看了这么多很累吧,呵呵,其实可以直接看代码的!前些时间有个朋友问我怎么解决用户重复登陆的问题,当时我就把这个问题记下来了,到昨天在学Struts2的时候又想着这个问题,所以就索性通过百度做了这么一个功能,这个功能是基于去年做的一个有前台和后台的系统,是用Jsp/Selvet+JDBC等实现的!如果这些代码你还是无法实现从数据库登陆的话,建议不用数据库!
--SessionListener.java监听器,记住要在web.xml中配置哦!
Java Code
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
|
package com.sc.listener;
import java.util.HashMap; import java.util.Map; import java.util.Set; 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; public class SessionListener implements HttpSessionListener, HttpSessionAttributeListener{ private static Map String> loginUsers = new HashMap String>(); //保存当前登录的用户名 private static Map String> htLoginUsers = new HashMap String>(); //保存当前登录的用户名 public static String SESSION_LOGIN_NAME = "user"; //用这个作为key,在session中保存前台用户名 public static String SESSION_HTLOGIN_NAME = "htUser"; //用这个作为key,在session中保存后台用户名 @Override public void attributeAdded(HttpSessionBindingEvent se) { //当执行setAttribute的时候, 当这个属性本来不存在于Session中时, 调用这个方法. if(se.getName().equals(SESSION_LOGIN_NAME)){ //如果添加的属性是用户名,则加入map中 loginUsers.put(se.getSession(), se.getValue().toString()); } if(se.getName().equals(SESSION_HTLOGIN_NAME)){ //如果添加的属性是用户名,则加入map中 htLoginUsers.put(se.getSession(), se.getValue().toString()); } } @Override public void attributeRemoved(HttpSessionBindingEvent se) { //当执行removeAttribute时调用的方法. if(se.getName().equals(SESSION_LOGIN_NAME)){ //如果移除的属性是用户名,则从map中移除 try{ loginUsers.remove(se.getSession()); } catch(Exception e){ } |