1 什么是cookie
瀏覽器與WEB服務器之間是使用HTTP協議進行通信的,當某個用戶發出頁面請求時,WEB服務器只是簡單的進行響應,然后就關閉與該用戶的連接。因此當一個請求發送到WEB服務器時,無論其是否是第一次來訪,服務器都會把它當作第一次來對待,這樣的不好之處可想而知。為了彌補這個缺陷,Netscape開發出了cookie這個有效的工具來保存某個用戶的識別信息,因此人們昵稱為“小甜餅”。cookies是一種WEB服務器通過瀏覽器在訪問者的硬盤上存儲信息的手段:Netscape Navigator使用一個名為cookies.txt本地文件保存從所有站點接收的Cookie信息;而IE瀏覽器把Cookie信息保存在類似于C:\windows\cookies的目錄下。當用戶再次訪問某個站點時,服務端將要求瀏覽器查找并返回先前發送的Cookie信息,來識別這個用戶。
2 cookie的四個屬性
max-age 指定Ccookie的生存周期(以秒為單位)!默認情況下,Cookie的值只在瀏覽器的會話期間存在,當用戶退出瀏覽器這些值就消失了!
path 指定與Cookie關聯在一起的網頁.默認情況下,cookie會和創建它的網頁以及與這個網頁處于同一個目錄下的網頁和處于該目錄下的子目錄關聯。
domain 設置訪問域 舉個例子:位于order.example.com的服務器要讀取catalog.example.com設置的cookie.這里就要引入domain屬性,假定由位于catalog.example.com的頁面創 的cookie把自己的path屬性設置為"/",把domain屬性設置為".example.com",那么所有位于"catalog.example.com"的網頁和所有位于"orders.example.com"的網頁以及所有位于example.com域的其他服務器上得網頁都能夠訪問這個cookie.如果沒有設置cookie的domain值,該屬性的默認值就是創建cookie的網頁所在的 服務器的主機名。 注意:不能將一個cookie的域設置成服務器所在的域之外的域.
seure 指定在網絡上如何傳輸cookie的值
3 java Cookie操作
創建Cookie
1
2
3
4
5
6
7
8
9
10
|
// new一個Cookie對象,鍵值對為參數 Cookie cookie = new Cookie( "key" , "cookie的value值" ); 如果cookie的值中含有中文時,需要對cookie進行編碼,不然會產生亂碼,使用 URLEncoder.encode( "cookie的value值" , "utf-8" ); // 設置Cookie最大生存時間,以秒為單位,負數的話為瀏覽器進程,關閉瀏覽器Cookie消失 cookie.setMaxAge(* 24 * 60 * 60 ); // 一天 // 將Cookie添加到Response中,使之生效 response.addCookie(cookie); //addCookie后,如果已經存在相同名字的cookie,則最新的覆蓋舊的cookie |
注意:在Struts中可以使用 ServletActionContext.getResponse()獲得respone對象
讀取cookie
讀取Cookie只能從request中獲取全部Cookie,然后循環迭代。
在Struts中可以使用 ServletActionContext.getRequest()獲得request對象
1
2
3
4
5
6
|
// 從request中獲取Cookie,拿到的是一個Cookie數組 Cookie[] cookies = request.getCookies(); // 然后迭代之 if (cookies != null && cookies.length > 0 ) { //如果沒有設置過Cookie會返回null for (Cookie cookie : cookies) {...} } |
刪除cookie
刪除Cookie的話,只需要將Cookie的生存期設為0即可
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length > 0 ) { for (Cookie cookie : cookies) { String name = cookie.getName(); // 找到需要刪除的Cookie if (name.compareTo( "target-key" ) == 0 ) { // 設置生存期為0 cookie.setMaxAge( 0 ); // 設回Response中生效 response.addCookie(cookie); } } } |
4 cookie的setPath方法使用:
正常的cookie只能在一個應用中共享,即一個cookie只能由創建它的應用獲得。
1.可在同一應用服務器內共享方法:設置cookie.setPath("/");
本機tomcat/webapp下面有兩個應用:webapp_a和webapp_b,
1)原來在webapp_a下面設置的cookie,在webapp_b下面獲取不到,path默認是產生cookie的應用的路徑。
2)若在webapp_a下面設置cookie的時候,增加一條cookie.setPath("/");或者cookie.setPath("/webapp_b/");
就可以在webapp_b下面獲取到cas設置的cookie了。
3)此處的參數,是相對于應用服務器存放應用的文件夾的根目錄而言的(比如tomcat下面的webapp),因此cookie.setPath("/");之后,可以在webapp文件夾下的所有應用共享cookie,而cookie.setPath("/webapp_b/");
是指cas應用設置的cookie只能在webapp_b應用下的獲得,即便是產生這個cookie的webapp_a應用也不可以。
4)設置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的時候,只有在webapp_b/jsp下面可以獲得cookie,在webapp_b下面但是在jsp文件夾外的都不能獲得cookie。
5)設置cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,這樣就不可以在產生cookie的應用webapp_a下面獲取cookie了
6)有多條cookie.setPath("XXX");語句的時候,起作用的以最后一條為準。
5 cookie.setDomain方法設計跨域共享
A機所在的域:home.langchao.com,A有應用webapp_a
B機所在的域:jszx.com,B有應用webapp_b
1)在webapp_a下面設置cookie的時候,增加cookie.setDomain(".jszx.com");,這樣在webapp_b下面就可以取到cookie。
2)輸入url訪問webapp_b的時候,必須輸入域名才能解析。比如說在A機器輸入:http://lc-bsp.jszx.com:8080/webapp_b,可以獲取webapp_a在客戶端設置的cookie,而B機器訪問本機的應用,輸入:http://localhost:8080/webapp_b則不可以獲得cookie。
3)設置了cookie.setDomain(".jszx.com");,還可以在默認的home.langchao.com下面共享
以上這篇老生常談java中cookie的使用就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。