1 Cookie入門
1、HTTP協議與Cookie
Cookie是HTTP協議制定的,先由服務器保存Cookie到瀏覽器,再下次瀏覽器請求服務器時把上一次請求得到Cookie再歸還給服務器。
Cookie是由服務器創建保存到客戶端瀏覽器的一個鍵值對,服務器保存Cookie的響應頭:Set-Cookie:aaa=AAA Set-Cookie:bbb=BBB
。
|——response.addHeader("Set-Cookie","aaa=AAA");
當瀏覽器請求服務器時,會把該服務器保存的Cookie隨請求發送給服務器。瀏覽器歸還Cookie的請求頭:Cookie:aaa=AAA;bbb=BBB
。
HTTP協議規定(保證不給瀏覽器太大壓力)
(1)1個Cookie最大4KB;
(2)一個服務器最多向1個瀏覽器保存20個Cookie;
(3)一個瀏覽器最多可以保存300個Cookie。
以上規定並不是強制性規定,不同瀏覽器對Cookie要求不一樣。這就是會話跟蹤技術。
2、Cookie的用途
(1)服務器使用Cookie來跟蹤客戶端狀態;
(2)保存購物車(購物車中的商品不能使用request保存,因爲它是一個用戶向服務器發送的多個請求消息)
(3)顯示上次登錄名(也是一個用戶多個請求)
但是要注意的是Cookie是不能跨瀏覽器的。
3、JavaWeb中使用Cookie
(1)原始方式:
|——使用response發送Set-Cookie響應頭;
|——使用request獲取Cookie請求頭;
(2)便捷方式:
|——使用response.addCookie()方法像瀏覽器保存Cookie;
|——使用request.getCookies()方法獲取瀏覽器歸還的Cookie。
4、Cookie例子
(1)a.jsp:一個JSP保存Cookie;
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Save Cookie</h1>
<%-- request\response\session\application\pageContext\config\out\page\exception --%>
<%
Cookie cookie1 = new Cookie("aaa", "AAA");
response.addCookie(cookie1);
Cookie cookie2 = new Cookie("bbb", "BBB");
response.addCookie(cookie2);
%>
</body>
</html>
(2)b.jsp:獲取瀏覽器歸還的cookie。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Get Cookies</h1>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie:cookies){
out.print(cookie.getName() + "=" + cookie.getValue() + "<br/>");
}
}
%>
</body>
</html>
2 Cookie的生存時長
Cookie不只有name和value兩個屬性。
Cookie的maxAge:Cookie的最大生命,即Cookie可保存的最大時長。以秒爲單位,例如,cookie.setMaxAge(60)表示這個Cookie會被瀏覽器保存到硬盤
(1)maxAge>0:瀏覽器會把Cookie保存到客戶機硬盤上,有效時長由maxAge的值決定;
(2)maxAge<0:Cookie只在瀏覽器內存中存在,當用戶關閉瀏覽器時,瀏覽器進程結束,同時Cookie也就死亡了。
(3)maxAge=0:瀏覽器會馬上刪除這個Cookie。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Save Cookie</h1>
<%-- request\response\session\application\pageContext\config\out\page\exception --%>
<%
Cookie cookie1 = new Cookie("aaa", "AAA");
cookie1.setMaxAge(60*60);
response.addCookie(cookie1);
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Get Cookies</h1>
<%
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie cookie:cookies){
cookie.setMaxAge(0);
}
}
%>
</body>
</html>
3 Cookie的路徑
Cookie的path並不是設置這個Cookie在客戶端的保存路徑。
Cookie的path由服務器創建Cookie時設置。
當瀏覽器訪問服務器某個路徑時,需要歸還哪些Cookie給服務器呢?這由Cookie的path來決定。
瀏覽器訪問服務器的路徑,如果包含某個Cookie的路徑,那麼就會歸還這個Cookie。
Cookie的path默認值:當前訪問路徑的父路徑。例如再訪問/lks/hhy/a.jsp時,響應的Cookie,那麼這個Cookie的默認path爲/lks/hhy
4 Cookie的域
domain用來指定Cookie的域名,當多個二級域中共享Cookie時纔有用。例如:www.baidu.com、zhidao.baidu.com、news.baidu.com、tieba.baidu.com之間共享Cookie時可以使用domain。
設置domain爲:cookie.setDomain("baidu.com")
設置path爲:cookie.setPath("/")