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