用到的類 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文件夾。
--------------------------------
下面是代碼,是直接從項目中實際代碼
- /**
- * 設置SSO認證標識(把用戶名,密碼 寫入客戶端瀏覽器的cookie),關閉瀏覽器後,cookie立即失效
- *
- * @param response
- * HttpServletResponse
- * @param userName
- * 用戶名
- * @param password
- * 密碼
- */
- public static void setReffer(final HttpServletResponse response, final String userName, final String password)
- {
- final String sSession = password + userName; //密碼是SHA1加密,長度爲40個字符(160位)
- Cookie oItem;
- // 因爲Cookie 中不允許保存特殊字符, 所以採用 BASE64 編碼,CookieUtil.encode()是BASE64編碼方法,略..
- oItem = new Cookie("SSO", CookieUtil.encode(sSession));
- oItem.setDomain(.google.com); //請用自己的域
- oItem.setMaxAge(-1); //關閉瀏覽器後,cookie立即失效
- oItem.setPath("/");
- response.addCookie(oItem);
- }
- /**
- * 認證SSO標識(從客戶端瀏覽器讀入cookie, 並取得用戶名、密碼,不能取得時返回null)
- *
- * @param request
- * @return 返回從cookie中取得的用戶名、密碼,不能取得時返回null.String[0]中保存用戶名,String[1]中保存密碼
- */
- public static String[] checkReffer(final HttpServletRequest request)
- {
- final Cookie[] oCookies = request.getCookies();
- if (oCookies != null)
- {
- for (final Cookie oItem : oCookies)
- {
- final String sName = oItem.getName();
- if (sName.equals("SSO"))
- {
- final String sSession = CookieUtil.decode(oItem.getValue()); //解碼 CookieUtil.decode()是BASE64解碼方法,略..
- if (sSession.length() > 40)
- {
- // 獲得存儲在 Cookies 中的用戶名稱和密碼
- final String sUser = sSession.substring(40);
- final String sPass = sSession.substring(0, 40);
- final String[] strArr =
- { sUser, sPass };
- return strArr; //返回用戶名,密碼
- }
- }
- }
- }
- return null;
- }
今天測試設置和獲取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的值;