Web阶段:第十六章:Cookie技术
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=" <%=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>
服务器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中的域名不要设置localhost,会出现获取不到的情况
这里以userid为例子,http://order.gmall.com:8086的,设置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中的值,默认为主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;
}
/***
* 设置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)// 设置域名的cookie
cookie.setDomain(getDomainName(request));
// 在域名的根路径下保存
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 获得cookie的主域名,本系统为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中的内容按照key删除
* @param request
* @param response
* @param cookieName
*/
public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, String cookieName) {
setCookie(request, response, cookieName, null, 0, false);
}
}