隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          實現Java Web程序的自動登錄

          本文為原創(chuàng),如需轉載,請注明作者和出處,謝謝!

          有很多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來管理用戶。也就是當第一次登錄成功后,就創(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到登錄界面
                   }
               }
          }

              雖然上面的代碼可以很好地實現自動登錄功能,但是當瀏覽器關閉,再次啟動后,由于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


          誰有其他的方法實現自動登錄,請跟貼!






          Android開發(fā)完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2008-06-05 13:49 銀河使者 閱讀(12917) 評論(8)  編輯  收藏 所屬分類: web 、 原創(chuàng)

          評論

          # re: 實現Java Web程序的自動登錄[未登錄]  回復  更多評論   

          有幾個問題需要和你探討一下
          1、為什么要長時間保存Session,這樣不利用大量的請求,除非在用戶很少的情況下。
          2、可以使用Cookie把用戶名和處理以后的密碼存入,下次訪問可以使用新的Session進行權限驗證就是了。至于該用戶的原Session信息。,可以采用其他方式保存下來,下次登錄進來驗證通過在加載就可以了
          2008-06-06 18:07 | Samuel

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          要保存用戶的信息,只能在客戶端或服務端來保存,如果在客戶端的cookie保存,有些信息無法保存,或比較麻煩,如對象等。

          在本例中因為我要實現當出現用戶登錄界面時,顯示用戶名,而這在可能要保存一年時間,而我又不想在一年內都自動登錄,所以用了session,并設了兩個小時。


          第二個問題。當然可以只使用cookie來保存用戶名和密碼。只因為我要實現短時間的自動登錄,所以才用了session。
          2008-06-06 18:16 | 銀河使者

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          現在我想知道的是除了將用戶名和密碼保存在cookie中,或使用session,還有沒有別的方法。
          2008-06-06 18:55 | 銀河使者

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          @銀河使者
          我覺得 都不好
          一個session存的時間太長
          第二cookie一點都不安全
          想想就兩個cookies 一個用戶名 一個密碼 就當真的被人看不出里面是什么意義
          但無論怎么樣 只要有這兩個cookies 你就能登陸
          別人也可以用js寫出cookies 所以一點都不安全
          2009-07-27 20:10 | 兔乃伊

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          我覺得可以這樣
          把session里面的內容持久化的數據庫
          登錄的時候去數據庫查查
          如果有自動登錄信息的話
          就開一個新的session給他
          然后把登錄信息存在session里面
          這樣我覺得可行
          2009-07-27 20:23 | 兔乃伊

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          用監(jiān)聽的方法 session失效 就持久化
          2009-07-27 20:24 | 兔乃伊

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          還不錯,如果能用一個完整的項目案例就好了
          2013-01-05 10:35 | bbkwang

          # re: 實現Java Web程序的自動登錄  回復  更多評論   

          天賦
          2016-06-02 16:05 | 委屈
          主站蜘蛛池模板: 邹城市| 浑源县| 同德县| 白山市| 汕尾市| 开化县| 招远市| 南漳县| 南丰县| 太和县| 通河县| 西峡县| 剑河县| 神农架林区| 平利县| 大英县| 峡江县| 新乐市| 平罗县| 崇文区| 古蔺县| 宿松县| 大城县| 石棉县| 任丘市| 宾阳县| 秦皇岛市| 临泽县| 沅陵县| 文化| 通州市| 阳山县| 巴林左旗| 临澧县| 麟游县| 武强县| 阜新市| 丽水市| 杭州市| 宁都县| 富锦市|