在用户登录时一起将sessionid传进去,记录到数据库
再加一个接口去获取用户ID(唯一)对应的sessionID
在之后跳转或者刷新页面时调用这个接口判断当前sessionID和存储到数据库的sessionID是否是同一个。不是同一个跳转到登录页面,重新登录。是就可以进入界面
还有一种逻辑是只做在后端,参考下面这个连接
JavaWeb-实现限制单个账号多处登录_咕噜咕噜da的博客-CSDN博客_java实现多点登录
知识点
思路如下:
演示
具体实现:
1.维护一个map集合
public class LoginUserMap {
private static Map<String, String> loginUserMap = new ConcurrentHashMap<String, String>();
/**
* set方法
*
* @param loginId 用户唯一标识,用户名或者用户Id
* @param sessionId sessionId
*/
public static void setLoginUserMap(String loginId, String sessionId) {
loginUserMap.put(loginId, sessionId);
}
/**
* get方法
*
* @return
*/
public static Map<String, String> getLoginUserMap() {
return loginUserMap;
}
/**
* 根据sessionId移除map中的值
*
* @param sessionId
*/
public static void removeUser(String sessionId) {
for (Map.Entry<String, String> entry : loginUserMap.entrySet()) {
if (sessionId.equals(entry.getValue())) {
loginUserMap.remove(entry.getKey());
break;
}
}
}
/**
* 判断用户是否在map中
*
* @param loginId
* @param sessionId
* @return
*/
public static boolean isInLoginUsers(String loginId, String sessionId) {
return (loginUserMap.containsKey(loginId) && sessionId.equals(loginUserMap.get(loginId)));
}
2.实现一个session监听,session销毁能及时更新map
@WebListener
public class SessionListener implements HttpSessionListener {
private Logger logger=LoggerFactory.getLogger(SessionListener.class);
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
HttpSession session = httpSessionEvent.getSession();
String sessionId &#