Servlet操作Cookie說明

用到的類 javax.servlet.http.Cookie

構造cookie 的方法 :  new Cookie(鍵,值)
構造函數如下:
Cookie(java.lang.String name, java.lang.String value)


把cookie發送給客戶端
HttpServletResponse.addCookie(javax.servlet.http.Cookie)


取得客戶瀏覽器的cookie,返回的是數組
HttpServletRequest.getCookies()


getComment/setComment 

      獲取/設置Cookie的註釋。


getDomain/setDomain
  獲取/設置Cookie適用的域。一般地,Cookie只返回給與發送它的服務器名字完全相同的服務器。使用這裏的方法可以指示瀏覽器把Cookie返回給同一域內的其他服務器。注意域必須以點開始(例如.sitename.com),非國家類的域(如.com,.edu,.gov)必須包含兩個點,國家類的域(如.com.cn,.edu.uk)必須包含三個點。


getMaxAge/setMaxAge
  獲取/設置Cookie過期之前的時間,以秒計。如果不設置該值,則Cookie只在當前會話內有效,即在用戶關閉瀏覽器之前有效,而且這些Cookie不會保存到磁盤上。

若生存時間爲負值,代表瀏覽器關閉Cookie即消失。生存時間爲0,代表刪除Cookie,生存時間爲正數,代表Cookie存在多少秒。


getName/setName
  獲取/設置Cookie的名字。本質上,名字和值是我們始終關心的兩個部分。由於HttpServletRequest的getCookies方法返回的是一個Cookie對象的數組,因此通常要用循環來訪問這個數組查找特定名字,然後用getValue檢查它的值。


getPath/setPath
  獲取/設置Cookie適用的路徑。如果不指定路徑,Cookie將返回給當前頁面所在目錄及其子目錄下的所有頁面。這裏的方法可以用來設定一些更一般的條件。例如,someCookie.setPath("/"),此時服務器上的所有頁面都可以接收到該Cookie。


getSecure/setSecure
  獲取/設置一個boolean值,該值表示是否Cookie只能通過加密的連接(即SSL)發送。


getValue/setValue
  獲取/設置Cookie的值。如前所述,名字和值實際上是我們始終關心的兩個方面。不過也有一些例外情況,比如把名字作爲邏輯標記(也就是說,如果名字存在,則表示true)。


getVersion/setVersion
  獲取/設置Cookie所遵從的協議版本。默認版本0(遵從原先的Netscape規範);版本1遵從RFC 2109 , 但尚未得到廣泛的支持。

幾個Cookie工具函數,獲取指定名字的Cookie值
   該函數是ServletUtilities.java的一部分。getCookieValue通過循環依次訪問Cookie對象數組的各個元素,尋找是否有指定名字的Cookie,如找到,則返回該Cookie的值;否則,返回參數中給出的默認值。getCookieValue能夠在一定程度上簡化Cookie值的提取。



cookie保存在哪裏
在Windows 9X系統計算機中,Cookie文件的存放位置爲C:\Windows\Cookies,在Windows NT/2000/ XP的計算機中,Cookie文件的存放位置爲C:\Documents and Settings\用戶名\Cookie文件夾。

--------------------------------

 

下面是代碼,是直接從項目中實際代碼

Java代碼  收藏代碼
  1. /** 
  2.  * 設置SSO認證標識(把用戶名,密碼 寫入客戶端瀏覽器的cookie),關閉瀏覽器後,cookie立即失效 
  3.  *  
  4.  * @param response 
  5.  *            HttpServletResponse 
  6.  * @param userName 
  7.  *            用戶名 
  8.  * @param password 
  9.  *            密碼 
  10.  */  
  11. public static void setReffer(final HttpServletResponse response, final String userName, final String password)  
  12. {  
  13.     final String sSession = password + userName;  //密碼是SHA1加密,長度爲40個字符(160位)  
  14.     Cookie oItem;  
  15.     // 因爲Cookie 中不允許保存特殊字符, 所以採用 BASE64 編碼,CookieUtil.encode()是BASE64編碼方法,略..  
  16.     oItem = new Cookie("SSO", CookieUtil.encode(sSession));  
  17.     oItem.setDomain(.google.com);  //請用自己的域  
  18.     oItem.setMaxAge(-1); //關閉瀏覽器後,cookie立即失效          
  19.     oItem.setPath("/");  
  20.     response.addCookie(oItem);  
  21. }  

 

Java代碼  收藏代碼
  1. /** 
  2.  * 認證SSO標識(從客戶端瀏覽器讀入cookie, 並取得用戶名、密碼,不能取得時返回null) 
  3.  *  
  4.  * @param request 
  5.  * @return 返回從cookie中取得的用戶名、密碼,不能取得時返回null.String[0]中保存用戶名,String[1]中保存密碼 
  6.  */  
  7. public static String[] checkReffer(final HttpServletRequest request)  
  8. {  
  9.     final Cookie[] oCookies = request.getCookies();  
  10.     if (oCookies != null)  
  11.     {  
  12.         for (final Cookie oItem : oCookies)  
  13.         {  
  14.             final String sName = oItem.getName();  
  15.   
  16.             if (sName.equals("SSO"))  
  17.             {  
  18.                 final String sSession = CookieUtil.decode(oItem.getValue()); //解碼 CookieUtil.decode()是BASE64解碼方法,略..  
  19.                 if (sSession.length() > 40)  
  20.                 {  
  21.                     // 獲得存儲在 Cookies 中的用戶名稱和密碼  
  22.                     final String sUser = sSession.substring(40);  
  23.                     final String sPass = sSession.substring(040);  
  24.                     final String[] strArr =  
  25.                     { sUser, sPass };  
  26.                     return strArr; //返回用戶名,密碼  
  27.                 }  
  28.             }  
  29.         }  
  30.     }  
  31.     return null;  
  32. }  





今天測試設置和獲取Cookie遇到了一點小問題,很奇怪的問題;

  把J2ee服務部署在本地 8080端口;訪問任何一個服務時,如果客戶端沒有cookie,則下發cookie,

  如果客戶端已經有了該cookie的值就不下發,代碼邏輯如下:

雙擊代碼全選
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
String uid="";
Cookie mycookies[] = request.getCookies();
 if (mycookies!= null) {
            for (int i = 0; i < mycookies.length; i++) {
                if ("uid".equalsIgnoreCase(mycookies[i].getName())) {
                    uid=mycookies[i].getValue();
                }
             }
        }
     if(!StringUtils.isNull(uid)){
      //do nothing
  }else{
  String host=request.getHeader("host");
 uid=UUID.create();
 Cookie  mycookie = new Cookie("uid",uid);
 mycookie.setDomain(host);
 mycookie.setMaxAge(93312000);//三年
 response.addCookie(mycookie);
}
System.out.println("uid is>"+uid);

  1、訪問:

  http://localhost:8080/

  以及內部的頁面,打印uid的值是相同的;符合要求

  2、訪問:

  http://127.0.0.1:8080

  以及內部的頁面, uid每次都獲取得值都是不同的;

  兩者的區別僅僅的訪問的方式不同,如果用ip訪問

  Cookie mycookies[] = request.getCookies();中永遠獲取不到uid的值;

  (80端口號除外)

  查了瀏覽器的具體cookie值,發現

  http://localhost:8080/ 訪問的時候,cookie值放在localhost下,服務器自動生成的SESSIONID也是存放在localhost路徑下。

  http://127.0.0.1:8080/ 訪問的時候,cookie uid值放在127.0.0.1:8080下,在127.0.0.1:8080下的cookie服務端的Servlet永遠都獲取不到;而服務器自動生成的SESSIONID則是在127.0.0.1下,與uid存放位置不同。

  所以在服務端下發cookie的時候,

  String host=request.getHeader("host");

  需要修改爲

雙擊代碼全選
1
2
3
if(host.indexOf(":")>-1){
      host=host.split(":")[0];
     }

  或者放棄設置mycookie.setDomain(host);

  這樣cookie值也是保存在127.0.0.1下的,與端口號不關聯

  當然是服務器已經有域名的就不會出現端口號下獲取不到cookie的值;


發佈了21 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章