隨筆 - 147  文章 - 71  trackbacks - 0
          <2012年6月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          1234567

          常用鏈接

          留言簿(1)

          隨筆分類(146)

          隨筆檔案(147)

          文章分類(28)

          文章檔案(28)

          喜歡的Blog

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          問題描述:
          當在標簽a中使用用戶A登錄后,再打開標簽b,進入登錄界面使用用戶B再次進行登錄。那么標簽a中的登錄信息就變成了用戶B的登錄信息。這種情況顯示不是用戶希望得到的。
          兩個標簽頁共用一個session。后一個把前一個的同名attribute域覆蓋了,致使數據混亂。

          解決辦法:
          辦法一:
          目標:實現多標簽中登錄多個用戶而互不影響。
          思路:將用戶登錄信息,比如用戶編號、登錄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取值:
          ${sessionScope[param.sid].session_urname}
          給session_urname加上一層Map,看似多余,其實不然。有兩點考慮,一是便于EL取值,如果有多個變量需要放到session里,如果不用Map,勢必要這樣寫:
          session.setAttribute("name" + sid.toString(), urname);
          session.setAttribute(
          "pwd" + sid.toString(), urpassword);
          你也許會想EL中取值時加上前綴唄:
          ${sessionScope['name' + param.sid]}
          很可惜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不知道為什么在頁面獲得焦點時會執行很多次?

          posted on 2012-06-08 09:33 飛翔天使 閱讀(6931) 評論(0)  編輯  收藏 所屬分類: JSP
          主站蜘蛛池模板: 竹山县| 页游| 沁水县| 长沙县| 九龙坡区| 淮滨县| 尚志市| 贡嘎县| 永吉县| 巨野县| 镇安县| 洪洞县| 江陵县| 蓝山县| 尖扎县| 承德市| 闻喜县| 赞皇县| 辽源市| 郑州市| 吉水县| 东阳市| 山阳县| 正安县| 团风县| 徐州市| 贡觉县| 东明县| 新乐市| 吉首市| 禄劝| 阳信县| 游戏| 寿阳县| 长沙县| 青铜峡市| 彩票| 唐海县| 新竹县| 昌平区| 公主岭市|