文章出處
文章列表
最近離職了, 突然記起來還一個小功能沒做, 想想也挺簡單,留下代碼和思路給同事做個參考。
換工作心里挺忐忑, 對未來也充滿了憧憬與擔憂。(雖然已是老人, 換了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
文章列表
全站熱搜