求助!spring实现同一个账号,重复登陆,后一个会把前一个挤掉,删除session的问题,附我的源代码!

不急god 2016-05-07 05:05:59
以下是我的代码,实现不了,求大牛们帮忙看一看,这是我在这家公司的第一个项目,求帮助啊
首先是web.xml配置的监听器
<!-- session监听器 监听用户登录 -->
<listener>
<listener-class>
com.xm.util.SessionListener
</listener-class>
</listener>

然后是监听器的类

ackage com.xm.util;

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.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.xm.entity.User;

import java.util.*;

/**
*
* 日期 : 2016-5-7<br>
* 作者 : zhangshulong<br>
* 项目 : ScaleWeb<br>
* 功能 :
* 监听器:用来监听用户登陆session,防止多次登陆,要求用户登陆方法中存放session格式为session.setAttribute("user"
* ,user);<br>
*/
public class SessionListener implements HttpSessionListener,
HttpSessionAttributeListener {
// log4j
private final static Log log = LogFactory.getLog(SessionListener.class);
/**
* seeionId和用户的绑定关系
*/
public static final Map<String, String> SESSIONID_USER=new HashMap<String,String>();
/**
* 用户和Session绑定关系
*/
public static Map<String, HttpSession> loginUser = new HashMap<String, HttpSession>();// 保存当前登录的所有用户

// 用这个作为session中的key
public static String SESSION_LOGIN_NAME = "user";

// 执行setAttribute的时候, 当这个属性本来不存在于Session中时, 调用这个方法.
public void attributeAdded(HttpSessionBindingEvent se) {

// 如果添加的属性是用户名, 则加入map中
if (se.getName().equals(SESSION_LOGIN_NAME)) {

User u = (User) se.getValue();


loginUser.put(u.getUsername(), se.getSession());
System.out.println("执行attributeAdded");
}

}

// 当执行removeAttribute时调用的方法
public void attributeRemoved(HttpSessionBindingEvent se) {
// 如果移除的属性是用户名, 则从map中移除
if (se.getName().equals(SESSION_LOGIN_NAME)) {
try {
User u = (User) se.getSession().getAttribute("user");
loginUser.remove(u.getUsername());
System.out.println("执行attributeRemoved");
} catch (Exception e) {
System.out.println("=============1===============");
log.debug(e);
}
}
}

// 当执行setAttribute时 ,如果这个属性已经存在, 覆盖属性的时候, 调用这个方法
public void attributeReplaced(HttpSessionBindingEvent se) {
// 如果改变的属性是用户名, 则跟着改变map
if (se.getName().equals(SESSION_LOGIN_NAME)) {

User u = (User) se.getValue();


loginUser.put(u.getUsername(), se.getSession());
System.out.println("执行attributeReplaced");
}
}

// session创建时调用这个方法
public void sessionCreated(HttpSessionEvent se) {
log.debug("SessionListener........session创建-----"
+ se.getSession().getId());
}

// Session失效或者过期的时候调用的这个方法,
public void sessionDestroyed(HttpSessionEvent se) {
// 如果session超时, 则从map中移除这个用户
try {
String sessionId=se.getSession().getId();
//User u = (User) se.getSession().getAttribute("user");
//loginUser.remove(u.getUsername());
loginUser.remove(SESSIONID_USER.remove(sessionId));
System.out.println("销毁session:"+sessionId);
} catch (Exception e) {
System.out.println("=============2===============");

log.debug(e);
}
}

/**
* 用户登录时的处理
* 处理一个账号同时只有一个地方登录的关键
* @param request
*/
public static void userLoginHandle(HttpServletRequest request){
//当前登录的用户
String userName=request.getParameter("userName");
//当前sessionId
String sessionId=request.getSession().getId();
//删除当前sessionId绑定的用户,用户--HttpSession
loginUser.remove(SESSIONID_USER.remove(sessionId));
//删除当前登录用户绑定的HttpSession
HttpSession session=loginUser.remove(userName);
if(session!=null){
SESSIONID_USER.remove(session.getId());
session.removeAttribute("userName");
session.setAttribute("userMsg", "您的账号已经在另一处登录了,你被迫下线!");
}
}
}


然后是工具类

import java.util.Set;

import javax.servlet.http.HttpSession;

/**
*
* 日期 : 2016-5-7<br>
* 作者 : zhangshulong<br>
* 项目 : ScaleWeb<br>
* 功能 : 登陆验证工具类<br>
*/
public class LogUtil {
/**
*
* Description : 判断用户是否登陆过
* @param username
* @return
*/
public static boolean isLogonUser(String username) {
Set<String> keys = SessionListener.loginUser.keySet();
if(keys.contains(username))
return true;
return false;
}
/**
*
* Description : 删除session,并将全局变量中的session删除
* @param username
*/
public static void removeSession(String username){
SessionListener.loginUser.get(username).invalidate();
}
}


最后是Controller层的登陆方法,在这里我只写登陆方法

@RequestMapping("lg")
public String login(Model model,HttpServletRequest request,String username,String password,String isFront){
HttpSession session = request.getSession();
if(username==null){
return "login";
}

List<User> list = userService.findUserByName(username);
User user = list.get(0);
System.out.println("=============username==================="+username);
if(LogUtil.isLogonUser(username)){//判断该账号是否登陆过
System.out.println("重复");
SessionListener.userLoginHandle(request);
System.out.println("删除之前同一账户登陆过的session");
}
session.setAttribute("user", user);
model.addAttribute("user", user);

if(isFront.equals("front")){
return "front/index";
}
return "back/index";
}



以上就是我的代码,实现不了,求大神们帮忙看一看啊


...全文
463 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouzhijian 2016-05-16
  • 打赏
  • 举报
回复
我用websocket实现过
不急god 2016-05-16
  • 打赏
  • 举报
回复
引用 5 楼 qq_34265384 的回复:
楼主 解决了? 我也遇到相同的问题 了
没有呢,等以后再做。。。。
qq_34265384 2016-05-14
  • 打赏
  • 举报
回复
楼主 解决了? 我也遇到相同的问题 了
vswen5 2016-05-09
  • 打赏
  • 举报
回复
将登陆的用户都保存起来 在拦截器中处理将同账号的前面登陆的删掉
jamesge2010 2016-05-09
  • 打赏
  • 举报
回复
你说一下实现了哪些功能,到了哪步实现不了,这样便于帮你针对找问题
tony4geek 2016-05-07
  • 打赏
  • 举报
回复
没看懂,不过你都用spring了。 可以去了解spring security
不急god 2016-05-07
  • 打赏
  • 举报
回复
我的QQ441985745,求知道大神回帖告诉一下,加我qq也行,拜托了!!!

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧