posts - 60,comments - 71,trackbacks - 0

          有很多Web程序中第一次登錄后,在一定時間內(如2個小時)再次訪問同一個Web程序時就無需再次登錄,而是直接進入程序的主界面(僅限于本機)。實現這個功能關鍵就是服務端要識別客戶的身份。而用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來管理用戶。也就是當第一次登錄成功后,就創建一個Session,并將用戶的某些信息保存在Session順。代碼如下:

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

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

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

              雖然上面的代碼可以很好地實現自動登錄功能,但是當瀏覽器關閉,再次啟動后,由于Servlet用于保存Session IDJSESSIONID Cookie是臨時的(也就是說不是持久Cookie,當瀏覽器關閉后,這個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);

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

          如果我們自已加一個JSESSIONID Cookie,在第一次訪問Web程序時,HTTP響應頭有兩個JSESSIONID,但由于這兩個JSESSIONID的值完全一樣,因此,并沒有任何影響。如果在響應頭的Set-Cookie字段中有多個相同的Cookie,則按著pathname進行比較,如果這兩個值相同,則認為是同一個Cookie,最后一個出現的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


          誰有其他的方法實現自動登錄,請跟貼!
          posted on 2008-06-10 16:54 henry1451 閱讀(351) 評論(0)  編輯  收藏 所屬分類: Java技術
          主站蜘蛛池模板: 百色市| 宁津县| 满城县| 忻州市| 平潭县| 方城县| 武功县| 泰安市| 广东省| 衢州市| 灵丘县| 来宾市| 成都市| 石嘴山市| 云林县| 华阴市| 兴和县| 突泉县| 新兴县| 嘉善县| 恩施市| 洛浦县| 肇源县| 澄江县| 阿荣旗| 呼伦贝尔市| 洛隆县| 裕民县| 留坝县| 湘西| 游戏| 瓦房店市| 鹿邑县| 册亨县| 博乐市| 威宁| 江北区| 连平县| 泰兴市| 武夷山市| 大连市|