jsp web中實現同一帳號同一時間只能一個地點登陸

來源:互聯網
上載者:User
jsp web中實現同一帳號同一時間只能一個地點登陸一、該功能有什麼作用 大家想想吧。反正總會有這樣的需求的。這年頭什麼需求不會有。。呵呵。有時候也不一定是需求,很有可能為了安全也會這麼做。例如考試系統,線上聊天系統,很有必要做成這樣的吧。二、實現過程 a.問題分析    在系統中,我們一般都是把登入資訊綁定到session中,看來從這入手是可能找到解決辦法。說白了,也就是當使用者登入時,判斷一下這個使用者有沒有登入,如果登入了,就把以前的那個session清除掉就OK了。。看似很簡單是不?其實你細想你會發現有以下問題:如何得到之前這個使用者有沒有登入過,也就是如何訪問到所有登入的session資訊呢?  b.具體實現   大家知道,在j2ee api好像是沒有具體的方法直接得到所有session資訊的。但是我們可以通過配製監聽器,監控所有的session建立和消毀過程,以及可以監控session中的屬性的建立,刪除和替換過程。 其實我們只要做以下處理即可: 在儲存使用者登入資訊到session時,對應的也就是session一個屬性的建立過程(attributeAdded),可以把當前這個session記錄到一個ArrayList中。 其實在儲存到list中時你要首先遍曆一下這個list中有沒有已經存在該使用者的登入資訊。如果存在就消毀掉這個list中存在的session資訊,並且從list中移除,不存在就把該session資訊放到list中。 在session的登入資訊消毀時,直接把該sesseion從list中移除掉。 還有就是當使用者登入後沒有退出直接登入這個時候是一個session屬性的替換過程。也要做處理判斷新的使用者是否已經在除了當前session的其它session中是否存在。存在則刪除。 具體代碼如下: package com.weirhp;import java.util.ArrayList;import java.util.Collections;import java.util.List;import javax.servlet.http.HttpSession;import javax.servlet.http.HttpSessionAttributeListener;import javax.servlet.http.HttpSessionBindingEvent;import javax.servlet.http.HttpSessionEvent;import javax.servlet.http.HttpSessionListener;public class RecordSessionListener implements HttpSessionAttributeListener, HttpSessionListener { private static List sessions; public static String loginFlag = "loginUser"; static { if (sessions == null) { sessions = Collections.synchronizedList(new ArrayList()); } } public void attributeAdded(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out.println("-------------*start added*-----------------------"); String attrName = e.getName(); // 登入 if (attrName.equals(loginFlag)) { User nowUser = (User) e.getValue(); User sUser = (User)session.getAttribute(loginFlag); // 遍曆所有session for (int i = sessions.size()-1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserID().equals(nowUser.getName())) { tem.getSession().invalidate();//自動調用remove break; } } SessionAndUser sau = new SessionAndUser(); sau.setUserID(nowUser.getName()); sau.setSession(session); sau.setSid(session.getId()); sessions.add(sau); } } public void attributeRemoved(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out.println("-------------*start Removed*-----------------------"); String attrName = e.getName(); // 登入 if (attrName.equals(loginFlag)) { User nowUser = (User) e.getValue(); // 遍曆所有session for (int i = sessions.size()-1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserID().equals(nowUser.getName())) { sessions.remove(i); break; } } } } public void attributeReplaced(HttpSessionBindingEvent e) { HttpSession session = e.getSession(); System.out.println("-------------*start replace*-----------------------"); String attrName = e.getName(); int delS=-1; // 登入 if (attrName.equals(loginFlag)) { // User nowUser = (User) e.getValue();//old value User nowUser = (User)session.getAttribute(loginFlag);//當前session中的user // 遍曆所有session for (int i = sessions.size()-1; i >= 0; i--) { SessionAndUser tem = sessions.get(i); if (tem.getUserID().equals(nowUser.getName())&&!tem.getSid().equals(session.getId())) { System.out.println("Remove:invalidate 1!"); delS=i; }else if(tem.getSid().equals(session.getId())){ tem.setUserID(nowUser.getName()); } } if (delS!=-1) { sessions.get(delS).getSession().invalidate();//失效時自動調用了remove方法。也就會把它從sessions中移除了 } } } public void sessionCreated(HttpSessionEvent e) { } public void sessionDestroyed(HttpSessionEvent e) { } }在web.xml中的配製1 2 recordSession3 com.weirhp.RecordSessionListener4
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.