1. 程式人生 > >第三十二章:Cookie技術

第三十二章:Cookie技術

作者:java_wxid
Cookie技術
a)什麼是Cookie?
1.Cookie翻譯過來是餅乾的意思。
2.Cookie是由伺服器通知客戶端,並由客戶端儲存鍵值對的一種技術。
它的構造器是:public Cookie(String name, String value) {}
3.只要客戶端有Cookie,每次請求都會發送給伺服器。
4.每個Cookie不能超過4kb的大小
b)如何建立Cookie
1、建立一個Cookie物件
2、呼叫response.addCookie( cookie );
在這裡插入圖片描述

protected void createCookie(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {		
//		1、建立一個Cookie物件
		Cookie cookie = new Cookie("key1", "value1");
		Cookie cookie2 = new Cookie("key2", "value2");
//		2、呼叫response.addCookie( cookie );
		response.addCookie(cookie);
		response.addCookie(cookie2);		
		response.getWriter().write("建立了Cookie");
}

c)伺服器如何獲取Cookie
只需要呼叫reqeust.getCookies():Cookie[]
圖解如何獲取Cookie。
在這裡插入圖片描述

protected void getCookie(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 獲取客戶端傳送過來的全部的Cookie物件
		Cookie[] cookies = request.getCookies();
		if (cookies != null && cookies.length > 0) {
			for (Cookie cookie : cookies) {
				response.getWriter().write("收到客戶端的Cookie:" + cookie.getName() + "====" + cookie.getValue() + "<br/>");
			}
		}
	}

工具類

public class CookieUtils {
	public static Cookie findCookie(String name,Cookie[] cookies) {
		if (name==null || cookies == null || cookies.length == 0) {
			return null;
		}
		for (Cookie cookie : cookies) {
			if (name.equals(cookie.getName())) {
				return cookie;
			}
		}
		return null;
	}	
}

d)Cookie值的修改

第一套方案是:
1、你要new一個同名的Cookie物件。
2、在構造器中傳入你要修改的新值。
3、呼叫response.addCookie()

//		1、你要new一個同名的Cookie物件。
//		2、在構造器中傳入你要修改的新值。
		Cookie cookie = new Cookie("key2", "newValue2");
//		3、呼叫response.addCookie()
		response.addCookie(cookie);

第二套方案是:
1、你需要先查詢到你要修改的Cookie物件
2、然後呼叫setValue方法設定新的值
3、最後呼叫response.addCookie();

//		1、你需要先查詢到你要修改的Cookie物件
		Cookie cookie = CookieUtils.findCookie("key1", request.getCookies());
		if (cookie != null) {
	//		2、然後呼叫setValue方法設定新的值
			cookie.setValue("newValue1");
	//		3、最後呼叫response.addCookie();
			response.addCookie(cookie);
		}

在谷歌瀏覽器中如何檢視Cookie資訊
在這裡插入圖片描述
在火狐 瀏覽器中如何檢視 Cookie資訊
在這裡插入圖片描述
e)Cookie生命控制
setMaxAge() 決定Cookie存活多久。
正數 在指定的秒數後過期。
零 表示馬上刪除Cookie
負數 表示瀏覽器關閉的時候,就刪除Cookie(預設的情況)

protected void deleteNow(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Cookie cookie = CookieUtils.findCookie("key2", request.getCookies());
		if (cookie != null) {
			cookie.setMaxAge(0);// 立即刪除Cookie
			response.addCookie(cookie);
		}
		response.getWriter().write("key2這個Cookie沒了");
	}
	
	protected void life3600(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		Cookie cookie = new Cookie("key2", "value3600");
		cookie.setMaxAge(60*60);//表示這個Cookie一個小時後被刪除
		response.addCookie(cookie);
		response.getWriter().write("建立一個一小時後才會被刪除的Cookie");
	}
	
	protected void defaultLife(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		// 創建出來的Cookie,maxAge預設值是-1,表示瀏覽器一關,Cookie就沒了。
		Cookie cookie = new Cookie("key1", "value1");
		response.addCookie(cookie);
		response.getWriter().write("預設創建出來的Cookie,瀏覽器一關就沒了");
	}

f)Cookie有效路徑Path的設定
Cookie中有一個path屬性,它可以有效的過濾哪些Cookie可以不用傻傻地傳送給伺服器。

當一個Cookie的path值為 /day14 表示請求地址是:http://ip:port/day14/* 那麼Cookie就會發送給伺服器

CookieA 的path=/day14
CookieB的path=/day14/abc

那麼現在請求地址為:http://ip:port/day14/c.html
CookieA會發送給伺服器

如果請求的地址為:http://ip:port/day14/abc/c.html
CookieA會發送給伺服器
CookieB會發送給伺服器

protected void pathTest(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException {
	Cookie cookie = new Cookie("key3", "pathtest");
	cookie.setPath(request.getContextPath() + "/abc"); // 得到 /day14/abc
	response.addCookie(cookie);
	response.getWriter().write("我建立了一個有path的Cookie");
}

g)Cookie練習—免輸入登入使用者名稱
在這裡插入圖片描述
表單:

<body>
	<form action="userServlet">
		<input type="hidden" name="action" value="login"/>
		使用者名稱:<input type="text" name="username" value="${ cookie.username.value }"/><br/>
		密碼:<input type="password" name="password" /><br/>
		<input type="submit" />
	</form>
</body>

伺服器Sevlet程式碼:

protected void login(HttpServletRequest request,
		HttpServletResponse response) throws ServletException, IOException {
	String username = request.getParameter("username");
	String password = request.getParameter("password");
	
	if ("wzg168".equals(username) && "123456".equals(password)) {
		// 登入成功
		Cookie cookie = new Cookie("username", username);
		cookie.setMaxAge(60*60*24*7);// 使用者名稱保留 一個星期
		response.addCookie(cookie);
		System.out.println("下次再來,我記住你啦");
	} else {
		// 登入失敗
		System.out.println("登入失敗!");
	}
}