总体思想:服务器管理session,每个用户一个sessionid,`当用户登录时判断,如果不存在则加入,如果已经存在,删除之前的seseionid,添加现在的sessionid. 其次设置过滤器,如果当前用户的sessionid,在服务器管理session的数据里消失了,则可以认为被挤掉,退到登录页。
1. 管理session部分
package www.pdwy.tools;
import javax.servlet.http.*;
import java.util.*;
public class SessionListener implements HttpSessionListener,HttpSessionBindingListener{
private static HashMap hUserName = new HashMap();//保存sessionID和username的映射
public void sessionCreated(HttpSessionEvent se){
}
public void sessionDestroyed(HttpSessionEvent se){
hUserName.remove( se.getSession().getId() );
}
public static boolean isAlreadyEnter(HttpSession session,String sUserName){
boolean flag = false;
if(hUserName.containsValue(sUserName)){//如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hUserName中
flag = true;
//遍历原来的hUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if( ( (String)val ).equals(sUserName) ){
hUserName.remove(key);
}
}
hUserName.put( session.getId(),sUserName );//添加现在的sessionID和username
System.out.println("hUserName = " + hUserName);
}
else{//如果该用户没登录过,直接添加现在的sessionID和username
flag = false;
hUserName.put( session.getId(),sUserName );
System.out.println("hUserName = " + hUserName);
}
return flag;
}
public static boolean isOnline(HttpSession session){
boolean flag = true;
if( hUserName.containsKey( session.getId() ) ){
flag = true;
}
else{
flag = false;
}
return flag;
}
public static boolean isOnline(String userName){
boolean flag = false;
if(hUserName.containsValue(userName)){
flag = true;
}
return flag;
}
public static void deleteCurUserSession(String userName){
Iterator iter = hUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if( ( (String)val ).equals(userName)){
hUserName.remove(key);
}
}
}
public void valueBound(HttpSessionBindingEvent e) {
}
public void valueUnbound(HttpSessionBindingEvent e) {
deleteCurUserSession(e.getName());
}
}
2. 登录部分核心代码
。。。。。
private SessionListener sessionListener = new SessionListener();
。。。。。
request.getSession().setAttribute(userName,sessionListener);
3. 过滤器核心代码
if (!SessionListener.isOnline(req.getSession())){
rep.sendRedirect(req.getContextPath()+"/login.jsp?msg=4");
}
4. 登录页核心代码
String warnCode = request.getParameter("msg");
<%if("4".equals(warnCode)){%>
alert("您的用户在另一个地方登陆,您已被强行下线");
<%}%>
j2ee实现强行挤掉重复登录用户
最新推荐文章于 2021-03-02 04:13:39 发布