1、在这里使用的是一个监听器,具体类如下所示:
public class SessionListener implements HttpSessionListener{
// 保存当前登录的用户民
public static Map<HttpSession, String> loginUser = new HashMap<HttpSession, String>();
public static HashMap hashUserName = new HashMap<>(); // 保存sessionID和username的映射
// 用这个作为session中的key
public static String SESSION_LOGIN_NAME = "username";
// session创建时调用这个方法
public void sessionCreated(HttpSessionEvent hse) {
}
// session失效或者过期时调用这个方法
public void sessionDestroyed(HttpSessionEvent hse) {
// 如果session过期,则从map中移除这个用户
hashUserName.remove(hse.getSession().getId());
}
/**
* 用于判断这个用户是否已经登录
*/
public static boolean isOnline(HttpSession session) {
return hashUserName.containsKey(session.getId());
}
/**
* 用于建立用户session
*/
@SuppressWarnings("unchecked")
public static void createUserSession(HttpSession session, String sessionUserName) throws Exception {
hashUserName.put(session.getId(), sessionUserName);
}
/**
* 根据用户名剔除session
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void removeUserSession(String sessionUserName) throws Exception {
Iterator iter = hashUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if (((String) val).equals(sessionUserName)) {
hashUserName.put(key, null);
iter.remove();
// hashUserName.remove(key);//当使用 fail-fast iterator 对
// Collection 或 Map 进行迭代操作过程中尝试直接修改 Collection / Map
// 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException
// 异常也将被抛出。
}
}
}
/**
* 用户已经登录则进行session剔除,否则建立新的session
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
public static void replaceUserSession(HttpSession session, String sessionUserName) throws Exception {
if (hashUserName.containsValue(sessionUserName)) {// 如果该用户已经登录过,则使上次登录的用户掉线(依据使用户名是否在hashUserName中)
// 遍历原来的hashUserName,删除原用户名对应的sessionID(即删除原来的sessionID和username)
Iterator iter = hashUserName.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
if (((String) val).equals(sessionUserName)) {
hashUserName.put(key, null);
iter.remove();
}
}
hashUserName.put(session.getId(), sessionUserName);// 添加现在的sessionID和username
} else {// 如果该用户没登录过,直接添加现在的sessionID和username
hashUserName.put(session.getId(), sessionUserName);
}
}
}
2、在登陆的controller中加入
<pre name="code" class="java">SessionListener.replaceUserSession(session, user.getUsername());//其中session为HttpSession session = request.getSession(); //user.getUsername()为用户名
3、用户退出代码
/**
* 退出登录
*
* @param request
* @return
*/
@RequestMapping("/exit.htm")
public @ResponseBody
Boolean exit(HttpServletRequest request) {
HttpSession session = request.getSession();
session.invalidate();
return true;
}
4、验证用户是否登录或在在线
/**
* 设置15分钟重新登录
*/
@RequestMapping(value = "/fifteenLogout.json")
public @ResponseBody
String fifteenLogout(HttpServletRequest request) {
Map<String, String> map = new HashMap<String, String>();
Gson gson = new Gson();
HttpSession session = request.getSession();
boolean isLogin = SessionListener.isOnline(session);
if (session.getAttribute("username") == null || session.getAttribute("username") == "" || isLogin == false) {
map.put("message", "您已在其它地方登录或者在15分钟以内没有操作,请重新登录!!!");
}
return gson.toJson(map);
}