java中cookie的存取刪以及用法生命週期
Cookie的屬性:
name:必須的
value:必須的
comment:可選的。註釋
path: 可選的,如果不設定路徑,那麼只有設定該cookie的URI及其子路徑可以訪問
寫Cookie的程式的訪問路徑是:http://localhost:8080/JavaWeb/servlet/CookieDemo
其中:localhost就是域名;/JavaWeb/servlet就是當前Cookie的path
若訪問的地址的URI包含著cookie的路徑,即URI.startWith(cookie的路徑),為true,則客戶端將該cookie帶給伺服器。
比如瀏覽器存的cookie的路徑是/JavaWeb
現在訪問的地址是:http://localhost:8080/JavaWeb/servlet/CookieDemo 則帶該cookie
現在訪問的地址是:http://localhost:8080/JavaWeb/CookieDemo 則帶該cookie
若瀏覽器存的cookie的路徑是/JavaWeb/servlet/
訪問的地址是:http://localhost:8080/JavaWeb/servlet/CookieDemo 則帶該cookie
訪問的地址是:http://localhost:8080/JavaWeb/CookieDemo 則不帶該cookie
如果一個cookie的路徑設定成了/JavaWeb,意味著瀏覽器訪問當前應用下的所有資源時都會帶著該cookie給伺服器。
domain:可選的。該Cookie所屬的網站域名。(apache.org)預設值。
maximumage:可選的。不設定就是會話過程(存在瀏覽器的記憶體中)。單位是秒
如果是0,說明要刪除。
version:可選的。
建立一個無生命週期的cookie,即隨著瀏覽器的關閉即消失的cookie,程式碼如下
Cookie cookie =
new
Cookie(
"cookiename"
,
"cookievalue"
);
response.addCookie(cookie);
下面建立一個有生命週期的cookie,可以設定他的生命週期
cookie =
new
Cookie(
"cookiename"
,
"cookievalue"
);
cookie.setMaxAge(
3600
);
//設定路徑,這個路徑即該工程下都可以訪問該cookie 如果不設定路徑,那麼只有設定該cookie路徑及其子路徑可以訪問
cookie.setPath(
"/"
);
response.addCookie(cookie);
下面介紹如何讀取cookie,讀取cookie程式碼如下
Cookie[] cookies = request.getCookies();
//這樣便可以獲取一個cookie陣列
for
(Cookie cookie : cookies){
cookie.getName();
// get the cookie name
cookie.getValue();
// get the cookie value
}
讀取時可以通過 cookie.getName.equals("") 來精確讀取一個cookie
上面就是基本的讀寫cookie的操作。我們在實際中最好進行一下封裝,比如增加一個cookie,我們關注的是cookie的name,value,生命週期,所以進行封裝一個函式,當然還要傳入一個response物件,addCookie()程式碼如下
/**
* 設定cookie
* @param response
* @param name cookie名字
* @param value cookie值
* @param maxAge cookie生命週期 以秒為單位
*/
public
static
void
addCookie(HttpServletResponse response,String name,String value,
int
maxAge){
Cookie cookie =
new
Cookie(name,value);
cookie.setPath(
"/"
);
if
(maxAge>
0
) cookie.setMaxAge(maxAge);
response.addCookie(cookie);
}
讀取cookie的時候,為了方便我們的操作,我們希望封裝一個函式,只要我們提供cookie的name,我們便可以獲取cookie的value,帶著這個想法,很容易想到將cookie封裝到Map裡面,於是進行下面的封裝
/**
* 根據名字獲取cookie
* @param request
* @param name cookie名字
* @return
*/
public
static
Cookie getCookieByName(HttpServletRequest request,String name){
Map<String,Cookie> cookieMap = ReadCookieMap(request);
if
(cookieMap.containsKey(name)){
Cookie cookie = (Cookie)cookieMap.get(name);
return
cookie;
}
else
{
return
null
;
}
}
/**
* 將cookie封裝到Map裡面
* @param request
* @return
*/
private
static
Map<String,Cookie> ReadCookieMap(HttpServletRequest request){
Map<String,Cookie> cookieMap =
new
HashMap<String,Cookie>();
Cookie[] cookies = request.getCookies();
if
(
null
!=cookies){
for
(Cookie cookie : cookies){
cookieMap.put(cookie.getName(), cookie);
}
}
return
cookieMap;
}
首先需要明白cookie的屬性不僅僅只有name和value,要刪除cookie也不是僅僅指定cookie的name就可以刪除,還有domain域和path屬性,maxage()表示持續時間。如下圖所示,可以得到的屬性很多。
![這裡寫圖片描述](https://i.iter01.com/images/63aff667e2625dc2848cc2d4dd8bef6cc6295a091429142fe00f88efb64573ea.png)
Cookie killMyCookie = new Cookie("cookiename1", null);
killMyCookie.setMaxAge(0);
killMyCookie.setPath("/");
response.addCookie(killMyCookie);
Cookie killMyCookie1 = new Cookie("cookiename2", null);
killMyCookie1.setMaxAge(0);
killMyCookie1.setPath("/");
response.addCookie(killMyCookie1);
這種方法確實可以刪除cookie,可是他的效果是介面載入後就刪除了,並不是我想要的點選某個按鈕後再刪除,因為當使用者並沒有點選登出,而是到了這個介面後又返回了,不可能讓其自動登出了吧!
只能想辦法將其寫成函式,然後點選呼叫。可是JAVA程式碼和JS程式碼卻不能很好的通訊,那就看看能不能用JS程式碼來刪除cookie,然後將JS程式碼寫成function來呼叫。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
JS設定cookie:
假設在A頁面中要儲存變數username的值("jack")到cookie中,key值為name,則相應的JS程式碼為:
document.cookie="name="+username;
JS讀取cookie:
假設cookie中儲存的內容為:name=jack;password=123
則在B頁面中獲取變數username的值的JS程式碼如下:
1
2
3
4
5
6
7
8
9
10
|
var
username=document.cookie.split( ";" )[0].split( "=" )[1]; //JS操作cookies方法! //寫cookies function
setCookie(name,value) { var
Days = 30; var
exp = new Date(); exp.setTime(exp.getTime() + Days*24*60*60*1000); document.cookie = name +
"=" + escape (value) +
";expires=" + exp.toGMTString(); } |
讀取cookies
1
2
3
4
5
6
7
8
|
function
getCookie(name) { var
arr,reg= new RegExp( "(^| )" +name+ "=([^;]*)(;|$)" ); if (arr=document.cookie.match(reg)) return
unescape(arr[2]); else return
null ; } |
刪除cookies
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
function
delCookie(name) { var
exp = new Date(); exp.setTime(exp.getTime() - 1); var
cval=getCookie(name); if (cval!= null ) document.cookie= name +
"=" +cval+ ";expires=" +exp.toGMTString(); } //使用示例 setCookie( "name" , "hayden" ); alert(getCookie( "name" )); //如果需要設定自定義過期時間 //那麼把上面的setCookie 函式換成下面兩個函式就ok; //程式程式碼 function
setCookie(name,value,time) { var
strsec = getsec(time); var
exp = new Date(); exp.setTime(exp.getTime() + strsec*1); document.cookie = name +
"=" + escape (value) +
";expires=" + exp.toGMTString(); } function
getsec(str) { alert(str); var
str1=str.substring(1,str.length)*1; var
str2=str.substring(0,1); if
(str2== "s" ) { return
str1*1000; } else
if (str2== "h" ) { return
str1*60*60*1000; } else
if (str2== "d" ) { return
str1*24*60*60*1000; } } //這是有設定過期時間的使用示例: //s20是代表20秒 //h是指小時,如12小時則是:h12 //d是天數,30天則:d30 setCookie( "name" , "hayden" , "s20" ); |
以上所述就是本文的全部內容了,希望大家能夠喜歡。
相關文章
- Java 中物件的生命週期Java物件
- Java 物件的生命週期Java物件
- java servlet 生命週期JavaServlet
- React生命週期以及注意事項React
- JAVA面試題:Spring中bean的生命週期Java面試題SpringBean
- Java執行緒的生命週期Java執行緒
- [Java基礎]物件的生命週期Java物件
- Java類的生命週期淺析Java
- Flutter 中的生命週期分析Flutter
- Spring中bean的生命週期SpringBean
- 【譯】WebAPI,Autofac,以及生命週期作用域WebAPI
- View生命週期與Activity生命週期的關係View
- Java之執行緒的生命週期Java執行緒
- (譯)理解Rust中的生命週期Rust
- 生命週期
- viewController的生命週期ViewController
- Servlet的生命週期Servlet
- UIViewController的生命週期UIViewController
- Flutter 的生命週期Flutter
- Spring的生命週期Spring
- bean的生命週期Bean
- SQL的生命週期SQL
- Laravel的生命週期Laravel
- 類的生命週期
- Android:聊聊 MVP 中 Presenter 的生命週期AndroidMVP
- 文盤Rust -- struct 中的生命週期RustStruct
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- Envoy 代理中的請求的生命週期
- 品牌生命週期和產品生命週期之間的關係
- Java開發學習(五)----bean的生命週期JavaBean
- vue - 生命週期Vue
- Fragment生命週期Fragment
- vue生命週期Vue
- spring生命週期Spring
- ubuntu生命週期Ubuntu
- Flutter - 生命週期Flutter
- sessionStorag 生命週期Session
- PHP 生命週期PHP
- maven生命週期Maven