<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 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 飛翔天使 閱讀(6934) 評論(0)  編輯  收藏 所屬分類: JSP
    主站蜘蛛池模板: 亚洲乱色熟女一区二区三区蜜臀| 性xxxx视频免费播放直播| 国产成人免费午夜在线观看| 久久国产精品亚洲一区二区| 国产乱妇高清无乱码免费| 亚洲精品无码专区2| eeuss影院www天堂免费| 精品国产日韩亚洲一区| a毛片免费播放全部完整| 亚洲AV综合色区无码一区| 在线观看片免费人成视频播放| 亚洲毛片αv无线播放一区| 国产一级在线免费观看| 亚洲成a人片在线观看无码| 亚洲精品免费在线观看| 亚洲校园春色小说| 亚洲第一成年免费网站| 亚洲色大成WWW亚洲女子| 免费A级毛片无码A| 久香草视频在线观看免费| 亚洲AV综合色区无码一区爱AV| 4hu四虎最新免费地址| 亚洲精品无码少妇30P| 亚洲欧洲久久久精品| 日韩免费电影网站| 亚洲AV无码久久久久网站蜜桃| 日韩色日韩视频亚洲网站| 国产成人无码区免费A∨视频网站| 四虎永久在线精品免费一区二区| 国产性爱在线观看亚洲黄色一级片| 免费一级不卡毛片| 亚洲а∨天堂久久精品9966| 亚洲成A∨人片天堂网无码| 99久久99这里只有免费的精品| 亚洲国产精品日韩在线| 亚洲AV成人精品日韩一区18p| 久久99免费视频| 亚洲人成人伊人成综合网无码| 久久综合亚洲色HEZYO国产| 免费精品国产日韩热久久| 性生大片视频免费观看一级 |