文章出處

最近離職了, 突然記起來還一個小功能沒做, 想想也挺簡單,留下代碼和思路給同事做個參考。

 

換工作心里挺忐忑, 對未來也充滿了憧憬與擔憂。(雖然已是老人, 換了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


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()