關於多標籤瀏覽器中session共享引起的問題

關於多標籤瀏覽器中session共享引起的問題 html

問題描述:
當在標籤a中使用用戶A登陸後,再打開標籤b,進入登陸界面使用用戶B再次進行登陸。那麼標籤a中的登陸信息就變成了用戶B的登陸信息。這種狀況顯示不是用戶但願獲得的。
兩個標籤頁共用一個session。後一個把前一個的同名attribute域覆蓋了,導致數據混亂。  java

解決辦法:
辦法一:
目標:實現多標籤中登陸多個用戶而互不影響。
思路:將用戶登陸信息,好比用戶編號、登陸ip等封裝到一個對象,而後以一個惟一值(好比登陸時間)爲key放入HashMap,再將HashMap放入session。
首先action中attribute的名字不能重複。 瀏覽器

//  避免同一PC多瀏覽器窗口不一樣帳戶共用session
Random random = new Random();
StringBuffer sid 
= new StringBuffer();
sid 
= sid.append(System.currentTimeMillis());   //  取系統時間
//  加上10爲0-9隨機數確保sid不重複
for (int i = 0; i < 10; i++) {
    sid 
= sid.append(random.nextInt(10));
}

//  把全部須要放進session的attribute放進一個Mapbar<String, Object>
//  一是便於el中取值、二是便於統一管理
Map sessionMap = new HashMap(); 
sessionMap.put(
"session_urname", urname);
session.setAttribute(sid.toString(), sessionMap);

String rd 
= "detail.jsp?sid=" + sid.toString();
request.getRequestDispatcher(rd).forward(request, response);
服務器

而後在jsp中用EL取值: session

${sessionScope[param.sid].session_urname} app

給session_urname加上一層Map,看似多餘,其實否則。有兩點考慮,一是便於EL取值,若是有多個變量須要放到session裏,若是不用Map,勢必要這樣寫: dom

session.setAttribute("name" + sid.toString(), urname);
session.setAttribute(
"pwd" + sid.toString(), urpassword); jsp

你也許會想EL中取值時加上前綴唄: spa

${sessionScope['name' + param.sid]} .net

很惋惜EL並不支持+號的字符串鏈接操做,這樣寫就不能用EL了;二是把全部須要放入session的變量都放入Map裏便於管理,特別是在字段不少的狀況下。
辦法二:
目標:退而求其次,打開新標籤頁進行登陸,再切換到舊標籤頁時,提示頁面已失效。若是打開新標籤頁,地址欄中直接輸入主頁面地址,則以同一用戶進行登陸。2個標籤頁的內容都有效。
思路:服務器在建立session時會爲每一個session分配一個惟一的sessionId,所以咱們能夠根據它來想辦法。首先定義一個public static 類型的HashMap:checkMap。假設個人登陸頁面爲login.jsp,主頁面爲main.jsp。後臺執行登陸檢查的方法爲checkLogin()。當執行登陸檢查的時候:

//得到sessionId
String sessionId = session.getId;
//標示頁面是否有效的值
int checkVal;
if(checkMap.containsKey(sessionId)) {
 checkVal 
= (Integer)checkMap.get(sessionId) + 1;
else {
  checkVal 
= 1;
}
checkMap.put(sessionId,checkVal);

當登陸成功,進入main.jsp頁面時,首先根據sessionId得到checkVal並存入一個頁面級的變量。下面就開始判斷了,每次標籤頁得到焦點時(window.onfocus)就將頁面中的變量與後臺根據sessionId從checkMap中獲得的checkVal進行比較,若是不想同,說明該頁面已經失效,提示信息並關閉該頁面。 可是仍有一個問題,window.onfocus不知道爲何在頁面得到焦點時會執行不少次?

相關文章
相關標籤/搜索