posts - 60,comments - 71,trackbacks - 0

          有很多Web程序中第一次登錄后,在一定時間內(nèi)(如2個小時)再次訪問同一個Web程序時就無需再次登錄,而是直接進入程序的主界面(僅限于本機)。實現(xiàn)這個功能關(guān)鍵就是服務端要識別客戶的身份。而用Cookie是最簡單的身從驗證。

          如果用戶第一次登錄,可以將用戶名作為Cookie寫到本地,代碼如下:


          Cookie cookie = new Cookie("user", user);
          cookie.setMaxAge(
          365 * 24 * 3600);
          cookie.setPath(
          "/");
          response.addCookie(cookie);

              當用戶再次訪問程序時,服務端程序應該檢測這個Cookie是否存在,代碼如下:

          Cookie[] cookies=request.getCookies();
          for(Cookie cookie: cookies)
          {
              if(cookie.getName().equals(user))
              {
                 
          // 如果user Cookie存在,進行處理
                  break;
              }
          }

              盡管從客戶端可以獲得User Cookie,但這上Cookie可能存在很長時間,而且僅憑這個Cookie就自動登錄并不安全,因此,可以在服務端使用一個Session來管理用戶。也就是當?shù)谝淮蔚卿洺晒螅蛣?chuàng)建一個Session,并將用戶的某些信息保存在Session順。代碼如下:

          HttpSession session =request.getSession();
          session.setAttribute(user, user);
          session.setMaxInactiveInterval(
          2 * 3600);  // Session保存兩小時

              
          當再次訪問程序時,確定了cookie存在后,就會繼續(xù)驗證User Session的存在,代碼如下:

          Cookie[] cookies=request.getCookies();
          for(Cookie cookie: cookies)
          {
              if(cookie.getName().equals(user))
              {
                 
          if(session.getAttribute(user) != null)
                  {
                     
          // 直接forward到主界面
                     break;
                  }
                  else
                  { 
                     
          // forward到登錄界面
                   }
               }
          }

              雖然上面的代碼可以很好地實現(xiàn)自動登錄功能,但是當瀏覽器關(guān)閉,再次啟動后,由于Servlet用于保存Session IDJSESSIONID Cookie是臨時的(也就是說不是持久Cookie,當瀏覽器關(guān)閉后,這個Cookie就會被刪除),因此,需要將JSESSIONID進行持久化。代碼如下:

          HttpSession session = request.getSession();
          session.setAttribute(user, user);
          session.setMaxInactiveInterval(
          2 * 3600);  // Session保存兩小時
          Cookie cookie = new Cookie("JSESSIONID", session.getId());
          cookie.setMaxAge(
          2 * 3600);  // 客戶端的JSESSIONID也保存兩小時
          session.setMaxInactiveInterval(interval)
          cookie.setPath(
          "/");        
          response.addCookie(cookie);

          如果使用上面的代碼,即使瀏覽器關(guān)閉,在兩小時之內(nèi),Web程序仍然可以自動登錄。

          如果我們自已加一個JSESSIONID Cookie,在第一次訪問Web程序時,HTTP響應頭有兩個JSESSIONID,但由于這兩個JSESSIONID的值完全一樣,因此,并沒有任何影響。如果在響應頭的Set-Cookie字段中有多個相同的Cookie,則按著pathname進行比較,如果這兩個值相同,則認為是同一個Cookie,最后一個出現(xiàn)的Cookie將覆蓋前面相同的Cookie,如下面的兩個Cookie,最后一個將覆蓋前一個:

          Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web

          Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web

              由于下面兩個Cookiepath不同,因此,它們是完全不同的兩個Cookie

          Set-Cookie: JSESSIONID=DDB2274CAC6739E1D6747B0043D5D90E; Path=/web1

          Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2008 05:02:50 GMT; Path=/web2


          誰有其他的方法實現(xiàn)自動登錄,請跟貼!
          posted on 2008-06-10 16:54 henry1451 閱讀(351) 評論(0)  編輯  收藏 所屬分類: Java技術(shù)
          主站蜘蛛池模板: 城口县| 焦作市| 塘沽区| 海口市| 利津县| 将乐县| 郓城县| 西和县| 和硕县| 澳门| 神池县| 晴隆县| 汽车| 延寿县| 高淳县| 霍州市| 彩票| 桐梓县| 罗源县| 辽阳县| 逊克县| 平定县| 通江县| 上虞市| 葵青区| 漳平市| 普格县| 焦作市| 奎屯市| 汉川市| 葵青区| 顺义区| 克东县| 临朐县| 平昌县| 甘谷县| 绥滨县| 辽中县| 蛟河市| 青铜峡市| 宜昌市|