81,094
社区成员
发帖
与我相关
我的任务
分享
<!-- 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();
}
}
@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";
}