iT邦幫忙

0

我需要用 servlet─jsp 實現一樣的帳號不能同時在線上,後者登入會把前者踢掉

  • 分享至 

  • xImage

各位前輩們好
我需要用 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 {
        ......密碼判斷式.....
pico2k iT邦新手 5 級 ‧ 2022-04-27 22:29:03 檢舉
可以在logout.java裡面,把session.invalid()用try catch包起來..
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0

我只能將理念跟你說一下。

首先,並不要去做由目前SESSION去清另一個SESSION。
本身這樣的做法是不對的。

基本第一招是用DB SESSION。
因為可以利用DB的特性來處理其它SESSION資料。

第二招則是用TOKEN招。
基本原理就是在登入時。從USER資料生成一組新的TOKEN。
則每次取用時去檢查目前SESSION的TOKEN是否符合USER表上的TOKEN。
基本每次去跟DB請求也不是很好。所以大多數都是會有對應的緩存資料來處理。

KKKKK iT邦新手 5 級 ‧ 2022-05-05 18:37:30 檢舉

您好,由於也是瞭解到一直跟DB求資料不好所以才會想說用目前session清之前session的想法......
我想請問"大多數都是會有對應的緩存資料來處理",緩存資料比如說什麼?可以舉個例子嗎?或是有相關資料可以推薦給我嗎?

首先,DB的方式也不是不好。實際上來說,session的預設是file式的。會不好清除其它SESSION的原因是。它儲存的位置非在WEB的路徑上。只能利用相關函式來處理。無法直接刪除。
但因為SESSION本身又有自身使用特性。
我之前其實有做過切換SESSION清空再切換回來。但在使用上很容易發生SESSION突然消失的問題。所以後來就不用此方式處理。

後來有用了一招,在登入時將目前的SESSIONID記錄到對應的USER身上。一開始還很好用。
但後來發生資安問題,會需要調整時效性。導致SESSIONID會自動更換而被自動登出。

最後還是DB SESSION解決我的問題。

目前其實我已經沒在用SESSION記錄東西了。

我要發表回答

立即登入回答