Web階段:第十六章:Cookie技術(shù)
Cookie技術(shù)
a)什么是Cookie?
1.Cookie翻譯過來是餅干的意思。
2.Cookie是由服務(wù)器通知客戶端,并由客戶端保存鍵值對的一種技術(shù)。
它的構(gòu)造器是:public Cookie(String name, String value) {}
3.只要客戶端有Cookie,每次請求都會發(fā)送給服務(wù)器。
4.每個Cookie不能超過4kb的大小
b)如何創(chuàng)建Cookie
1、創(chuàng)建一個Cookie對象
2、調(diào)用response.addCookie( cookie );
protected void createCookie(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 1、創(chuàng)建一個Cookie對象
Cookie cookie = new Cookie("key1", "value1");
Cookie cookie2 = new Cookie("key2", "value2");
// 2、調(diào)用response.addCookie( cookie );
response.addCookie(cookie);
response.addCookie(cookie2);
response.getWriter().write("創(chuàng)建了Cookie");
}
c)服務(wù)器如何獲取Cookie
只需要調(diào)用reqeust.getCookies():Cookie[]
圖解如何獲取Cookie。
protected void getCookie(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 獲取客戶端發(fā)送過來的全部的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、在構(gòu)造器中傳入你要修改的新值。
3、調(diào)用response.addCookie()
// 1、你要new一個同名的Cookie對象。
// 2、在構(gòu)造器中傳入你要修改的新值。
Cookie cookie = new Cookie("key2", "newValue2");
// 3、調(diào)用response.addCookie()
response.addCookie(cookie);
第二套方案是:
1、你需要先查找到你要修改的Cookie對象
2、然后調(diào)用setValue方法設(shè)置新的值
3、最后調(diào)用response.addCookie();
// 1、你需要先查找到你要修改的Cookie對象
Cookie cookie = CookieUtils.findCookie("key1", request.getCookies());
if (cookie != null) {
// 2、然后調(diào)用setValue方法設(shè)置新的值
cookie.setValue("newValue1");
// 3、最后調(diào)用response.addCookie();
response.addCookie(cookie);
}
在谷歌瀏覽器中如何查看Cookie信息
在火狐 瀏覽器中如何查看 Cookie信息
e)Cookie生命控制
setMaxAge() 決定Cookie存活多久。
正數(shù) 在指定的秒數(shù)后過期。
零 表示馬上刪除Cookie
負(fù)數(shù) 表示瀏覽器關(guān)閉的時候,就刪除Cookie(默認(rèn)的情況)
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("創(chuàng)建一個一小時后才會被刪除的Cookie");
}
protected void defaultLife(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 創(chuàng)建出來的Cookie,maxAge默認(rèn)值是-1,表示瀏覽器一關(guān),Cookie就沒了。
Cookie cookie = new Cookie("key1", "value1");
response.addCookie(cookie);
response.getWriter().write("默認(rèn)創(chuàng)建出來的Cookie,瀏覽器一關(guān)就沒了");
}
f)Cookie有效路徑Path的設(shè)置
Cookie中有一個path屬性,它可以有效的過濾哪些Cookie可以不用傻傻地發(fā)送給服務(wù)器。
當(dāng)一個Cookie的path值為 /day14 表示請求地址是:http://ip:port/day14/* 那么Cookie就會發(fā)送給服務(wù)器
CookieA 的path=/day14
CookieB的path=/day14/abc
那么現(xiàn)在請求地址為:http://ip:port/day14/c.html
CookieA會發(fā)送給服務(wù)器
如果請求的地址為:http://ip:port/day14/abc/c.html
CookieA會發(fā)送給服務(wù)器
CookieB會發(fā)送給服務(wù)器
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("我創(chuàng)建了一個有path的Cookie");
}
g)Cookie練習(xí)—免輸入登錄用戶名
表單:
- <body>
- <form action="userServlet">
- <input type="hidden" name="action" value="login"/>
- <!--用戶名:<input type="text" name="username" value=" <%=request.getCookies()[0].getValue() %>"/>-->
- 用戶名:<input type="text" name="username" value="${ cookie.username.value }"/><br/>
- 密碼:<input type="password" name="password" /><br/>
- <input type="submit" />
- </form>
- </body>
服務(wù)器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);// 用戶名保留 一個星期
//如果二次的請求不同,頁面可能不會顯示,所以有時需要cookie .setPath("你保存在客戶端cookie的路徑");
response.addCookie(cookie);
System.out.println("下次再來,我記住你啦");
} else {
// 登錄失敗
System.out.println("登錄失??!");
}
}
如果二次的請求不同,cookie中的域名不要設(shè)置localhost,會出現(xiàn)獲取不到的情況
這里以userid為例子,http://order.gmall.com:8086的,設(shè)置userId到cookie中
主要代碼就一行:
//將userId保存到cookie中
CookieUtil.setCookie(request,response,“userId”,userLogin.getId(),606024,true);
http://list.gmall.com:8083的,獲取cookie中的userId
主要代碼就一行:
//從cookie中獲取userID
String userId = CookieUtil.getCookieValue(request, “userId”, true);
工具類:
package com.javawxid.util;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
/**
* @param
* @return
*/
public class CookieUtil {
/***
* 獲得cookie中的值,默認(rèn)為主ip:www.gmall.com
* @param request
* @param cookieName
* @param isDecoder
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
Cookie[] cookies = request.getCookies();
if (cookies == null || cookieName == null){
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals(cookieName)) {
if (isDecoder) {//如果涉及中文
retValue = URLDecoder.decode(cookies[i].getValue(), "UTF-8");
} else {
retValue = cookies[i].getValue();
}
break;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retValue;
}
/***
* 設(shè)置cookie的值
* @param request
* @param response
* @param cookieName
* @param cookieValue
* @param cookieMaxage
* @param isEncode
*/
public static void setCookie(HttpServletRequest request,
HttpServletResponse response, String cookieName, String cookieValue, int
cookieMaxage, boolean isEncode) {
try {
if (cookieValue == null) {
cookieValue = "";
} else if (isEncode) {
cookieValue = URLEncoder.encode(cookieValue, "utf-8");
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage >= 0)
cookie.setMaxAge(cookieMaxage);
if (null != request)// 設(shè)置域名的cookie
cookie.setDomain(getDomainName(request));
// 在域名的根路徑下保存
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 獲得cookie的主域名,本系統(tǒng)為gmall.com,保存時使用
* @param request
* @return
*/
private static final String getDomainName(HttpServletRequest request) {
String domainName = null;
String serverName = request.getRequestURL().toString();
if (serverName == null || serverName.equals("")) {
domainName = "";
} else {
serverName = serverName.toLowerCase();
serverName = serverName.substring(7);
final int end = serverName.indexOf("/");
serverName = serverName.substring(0, end);
final String[] domains = serverName.split("\\.");
int len = domains.length;
if (len > 3) {
// www.xxx.com.cn
domainName = domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
} else if (len <= 3 && len > 1) {
// xxx.com or xxx.cn
domainName = domains[len - 2] + "." + domains[len - 1];
} else {
domainName = serverName;
}
}
if (domainName != null && domainName.indexOf(":") > 0) {
String[] ary = domainName.split("\\:");
domainName = ary[0];
}
System.out.println("domainName = " + domainName);
return domainName;
}
/***
* 將cookie中的內(nèi)容按照key刪除
* @param request
* @param response
* @param cookieName
*/
public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
setCookie(request, response, cookieName, null, 0, false);
}
}