之前写过一篇有shiro 框架的,,shiro 可以管理session,所以容易拿到前一个session对象,给session添加一个标志,,https://blog.csdn.net/qq_21770005/article/details/81356388
这一篇是没有shiro 的,实现更简单,你可以用filter 或者interceptor 去实现,,核心代码如下
//用户是否登录
User user = (User) request.getSession().getAttribute(UserConst.USER_SESSION_SING);
String userKey = null;
if(user == null) {
//用户未登录 过
filterChain.doFilter(servletRequest,servletResponse);
}else {
//用户登录
userKey = SESSION_ID_KEY_PREFIX + user.getId();
String kickoutSessionId = (String) EhCacheUtil.get(SESSION_CACHE_NAME,userKey);
if(kickoutSessionId != null && !StringUtils.equals(currentSessionId,kickoutSessionId)) {
//存在且不相等
//清楚缓存
EhCacheUtil.remove(SESSION_CACHE_NAME,userKey);
request.getSession().invalidate();
//Ajax 请求另作处理
String type = request.getHeader("X-Requested-With");
if (StringUtils.equals(type, "XMLHttpRequest")) {
response.setHeader("redirectUrl", "/");
} else {
response.sendRedirect("/");
}
}else {
//同一个登录 不互挤 保存当前sessionId
EhCacheUtil.put(SESSION_CACHE_NAME,userKey,currentSessionId,true);
filterChain.doFilter(servletRequest,servletResponse);
}
如果没有任何的缓存工具,,如redis 可以考虑用 这里写代码片
request.getSession().getServletContext().getAttribute(userSessionKey)