最近离职了, 突然记起来还一个小功能没做, 想想也挺简单,留下代码和思路给同事做个参考。
换工作心里挺忐忑, 对未来也充满了憧憬与担忧。(虽然已是老人, 换了N次工作了,但每次心里都和忐忑)。
写写代码反而心里平静了很多。
入正题,上思路,其实很简单
一 场景
用户u1只能在A电脑登录,当在B电脑登录时,A电脑登录状态被取消
二 思路
1.创建一个session监听器去监听session属性的创建
2,用个map储存(如果用户量大可以用KV数据库,如redis之类),K 为用户名, V为session的
3. 当检测到session的属性 userName添加时,把对应的session中userName属性清空
三 主要代码
package com.he.login;import java.util.HashMap;
import java.util.Map;import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
/**
* 用于监听session属性的添加
*
* @author 何锦彬 QQ 277803242
*
*/
public class LoginListener implements HttpSessionAttributeListener {
// 已经登录用户session
public static Map<String, HttpSession> loginedUser = new HashMap<String, HttpSession>(); public void attributeAdded(HttpSessionBindingEvent eventAdd) {
// TODO 监听session属性的添加
String attrName = eventAdd.getName();
// 监听到为属性userName的添加
if ("userName".equals(attrName)) {
String value = (String) eventAdd.getValue();
HttpSession session = loginedUser.get(value);
if (session != null) {
session.removeAttribute(attrName);
}
loginedUser.put(value, eventAdd.getSession());
} } public void attributeRemoved(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub } public void attributeReplaced(HttpSessionBindingEvent arg0) {
// TODO Auto-generated method stub }}
四,效果
可以用chrome模拟A电脑, IE模拟B电脑
第一次用chrome 登录,显示成功,刷新还是成功
第二次用IE登录,成功
此时chrome再次刷新,返回登录页面
整个项目代码地址
https://github.com/bensonHe/LoginOnlyOne
下下来访问
http://localhost:端口/LoginOnlyOne