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 閱讀(354) 評論(0)  編輯  收藏 所屬分類: Java技術
          主站蜘蛛池模板: 泾源县| 呈贡县| 汉沽区| 沙田区| 武平县| 五家渠市| 常州市| 自贡市| 海城市| 黄梅县| 江口县| 乐平市| 海阳市| 福安市| 云林县| 兰州市| 隆安县| 永吉县| 布尔津县| 禄丰县| 呼伦贝尔市| 蒙阴县| 和顺县| 苏尼特右旗| 富蕴县| 兴海县| 西宁市| 大关县| 汕尾市| 西丰县| 金平| 綦江县| 饶阳县| 垫江县| 大理市| 姚安县| 伽师县| 澎湖县| 沿河| 张家港市| 兰考县|