各位前輩們好
我需要用 servlet─jsp 實現一樣的帳號不能同時在線上,後者會把前者踢掉
依照下方程式碼可以實現
主要是把前一個登進的session.invalidate()掉,這樣前一個登進的頁面就會跳回燈入頁(只是要按重新整理或其他按鈕,不會自動跳轉)
但是如果我用同一個瀏覽器按了登出會觸發logout.java的invalidate(),登出後再登入觸發的下面程式碼的session.invalidate()就會報錯
Message invalidate: Session already invalidated
但查了網路卻好像也沒有辦法把session變成null的方法
remove()方法移掉了sessionID 在這邊好像也沒幫助
請問有什麼方式可以提供給我參考的嗎?
謝謝各位
Login.java
//userName,session
public static final Map<String,HttpSession> userName_session = new HashMap<String,HttpSession>();
//sessionId,userName
public static final Map<String,String> sessionId_userName = new HashMap<String,String>();
// Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String clientIP = request.getRemoteAddr();
boolean isExec = false;
String userName = request.getParameter("userName");
String password = request.getParameter("password");
UserBean userBean = null;
String sessionId = request.getSession().getId();
HttpSession session1 = request.getSession(); //當前用戶的session
sessionId = request.getSession().getId(); //當前用戶的sessionId
sessionId_userName.put(sessionId, userName); //放入當前用戶及userId
HttpSession session = userName_session.remove(userName);//USR_SESSION移除上個用戶的session
if(session != null){
sessionId_userName.remove(session.getId());
session.invalidate();
sessionId_userName.remove(session.getId()); //session根據sessionId 找到上個userId對應的session 移除
request.setAttribute("msgReLogin","相同帳號登入,您將被登出"); //session移除後向前台發送信息
}
userName_session.put(userName,session1);
try {
......密碼判斷式.....
我只能將理念跟你說一下。
首先,並不要去做由目前SESSION去清另一個SESSION。
本身這樣的做法是不對的。
基本第一招是用DB SESSION。
因為可以利用DB的特性來處理其它SESSION資料。
第二招則是用TOKEN招。
基本原理就是在登入時。從USER資料生成一組新的TOKEN。
則每次取用時去檢查目前SESSION的TOKEN是否符合USER表上的TOKEN。
基本每次去跟DB請求也不是很好。所以大多數都是會有對應的緩存資料來處理。
您好,由於也是瞭解到一直跟DB求資料不好所以才會想說用目前session清之前session的想法......
我想請問"大多數都是會有對應的緩存資料來處理",緩存資料比如說什麼?可以舉個例子嗎?或是有相關資料可以推薦給我嗎?
首先,DB的方式也不是不好。實際上來說,session的預設是file式的。會不好清除其它SESSION的原因是。它儲存的位置非在WEB的路徑上。只能利用相關函式來處理。無法直接刪除。
但因為SESSION本身又有自身使用特性。
我之前其實有做過切換SESSION清空再切換回來。但在使用上很容易發生SESSION突然消失的問題。所以後來就不用此方式處理。
後來有用了一招,在登入時將目前的SESSIONID記錄到對應的USER身上。一開始還很好用。
但後來發生資安問題,會需要調整時效性。導致SESSIONID會自動更換而被自動登出。
最後還是DB SESSION解決我的問題。
目前其實我已經沒在用SESSION記錄東西了。