1.设置Cookie
Cookie cookie = new Cookie("key", "value");
//设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。
cookie.setMaxAge(60);
//设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分)
cookie.setPath("/test/test2");
response.addCookie(cookie);
2.读取Cookie
//该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null
Cookie[] cookies = request.getCookies();
3.删除Cookie
Cookie cookie = new Cookie("key", null);
//设置为0为立即删除该Cookie
cookie.setMaxAge(0);
//删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie
cookie.setPath("/test/test2");
response.addCookie(cookie);
注:经测试,不论path的值设为什么都会把所有同名cookie删掉,不知道为什么?
4.修改Cookie
Cookie[] cookies = request.getCookies();
if(cookies.length>1){
for(int i=0;i<cookies.length;i++){
if(cookies[i].getName().equals("key")) {
String oldValue =cookies[i].getValue();
String newValue= "newValue";
cookies[i].setValue(newValue);
response.addCookie(cookies[i]);
break;
}
}
}
===============================================================
1.实现两个网站www.wangwz.com和post.wangwz.com共用Cookies
2.添加Cookies
Cookie cookie = new Cookie("name", "wangwz");
//设置路径
cookie.setPath("/");
//这个也要设置才能实现上面的两个网站共用
cookie.setDomain(".wangwz.com");
//不设置的话,则cookies不写入硬盘,而是写在内存,只在当前页面有用,以秒为单位
cookie.setMaxAge(365*24*60*60);
response.addCookie(cookie);
cookie = new Cookie("nick", URLEncoder.encode("王伟宗","UTF-8"));
cookie.setPath("/");
cookie.setDomain(".wangwz.com");
cookie.setMaxAge(365*24*60*60);
response.addCookie(cookie);
3.获取cookies
Cookie cookies[] = request.getCookies();
if (cookies != null)
{
for (int i = 0; i < cookies.length; i++)
{
if (cookies[i].getName().equals("nick"))
{
System.out.println(URLDecoder.decode(cookies[i].getValue(),"UTF-8"));
}
}
}
4.删除cookies
Cookie cookies[] = request.getCookies();
if (cookies != null)
{
for (int i = 0; i < cookies.length; i++)
{
if (cookies[i].getName().equals("nick"))
{
//如果不支持null请使用""
Cookie cookie = new Cookie("nick",null);
//设置成跟写入cookies一样的
cookie.setPath("/");
//设置成跟写入cookies一样的
cookie.setDomain(".wangwz.com");
response.addCookie(cookie);
}
}
}
注:经测试,不论path的值设为什么都会把所有同名cookie删掉,不知道为什么?
========================================================
应用实例
<%@ page contentType="text/html;charset=gb2312" language="java" import="java.util.*" errorPage="" %>
<%@ page import="java.net.URLDecoder"%> //注意导入此包
<%
Cookie cookie = new Cookie("hi","welcome");
response.addCookie(cookie);
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(int i = 0; i < cookies.length; i++){
if(cookies[i].getName().equals("hi")){
String cookieValue = URLDecoder.decode(cookies[i].getValue(),"utf-8");
out.print("hi="+cookieValue);
}
}
}else{
out.print(" no cookie");
}
%>
自己写的工具类:
package com.activelife.common.utils;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Cookie 工具类
*
* @author zhangpanfeng
*
*/
public class CookieUtil {
public static final String DEFAULT_DOMAIN = ".activelife.com";
public static final String DEFAULT_PATH = "/";
/**
* 根据Cookie名称获取Cookie
*
* @param request
* @param name
* Cookie名称
* @return Cookie对象
*/
public static Cookie getCookie(HttpServletRequest request, String name) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
int length = cookies.length;
for (int i = 0; i < length; i++) {
if (cookies[i].getName().equals(name)) {
return cookies[i];
}
}
}
return null;
}
/**
* 根据Cookie名称获取Cookie的值
*
* @param request
* @param name
* Cookie名称
* @return Cookie值
*/
public static String getCookieValue(HttpServletRequest request, String name) {
Cookie cookie = getCookie(request, name);
return cookie == null ? null : cookie.getValue();
}
/**
* 添加Cookie
*
* @param response
* @param key
* Cookie键
* @param value
* Cookie值
* @param validDays
* Cookie有效天数,null表示永不失效
* @param domain
* Cookie domain, null表示使用默认domain ".activelife.com"
* @param path
* Cookie 路径, null表示使用默认路径 "/"
*/
public static void addCookie(HttpServletResponse response, String key, String value, Integer validDays,
String domain, String path) {
Cookie cookie = new Cookie(key, value);
if (validDays != null && validDays >= 0) {
cookie.setMaxAge(validDays * 3600 * 24);
}
if (domain != null) {
cookie.setDomain(domain);
} else {
cookie.setDomain(DEFAULT_DOMAIN);
}
if (path != null) {
cookie.setPath(path);
} else {
cookie.setPath(DEFAULT_PATH);
}
response.addCookie(cookie);
}
/**
* 删除Cookie
*
* @param response
* @param key
* Cookie键
* @param path
* Cookie路径, null表示使用默认路径 "/"
*/
public static void deleteCookie(HttpServletResponse response, String key, String path) {
Cookie cookie = new Cookie(key, "");
cookie.setMaxAge(0);
if (path != null) {
cookie.setPath(path);
} else {
cookie.setPath(DEFAULT_PATH);
}
response.addCookie(cookie);
}
}
1.domain表示的是cookie所在的域,默认为请求的地址,如网址为www.test.com/test/test.aspx,那么domain默认为www.test.com。而跨域访问,如域A为t1.test.com,域B为t2.test.com,那么在域A生产一个令域A和域B都能访问的cookie就要将该cookie的domain设置为.test.com;如果要在域A生产一个令域A不能访问而域B能访问的cookie就要将该cookie的domain设置为t2.test.com。
2.path表示cookie所在的目录,asp.net默认为/,就是根目录。在同一个服务器上有目录如下:/test/,/test/cd/,/test/dd/,现设一个cookie1的path为/test/,cookie2的path为/test/cd/,那么test下的所有页面都可以访问到cookie1,而/test/和/test/dd/的子页面不能访问cookie2。这是因为cookie能让其path路径下的页面访问。
3.浏览器会将domain和path都相同的cookie保存在一个文件里,cookie间用*隔开。
4.含值键值对的cookie:以前一直用的是nam=value单键值对的cookie,一说到含多个子键值对的就蒙了。现在总算弄清楚了。含多个子键值对的cookie格式是name=key1=value1&key2=value2。可以理解为单键值对的值保存一个自定义的多键值字符串,其中的键值对分割符为&,当然可以自定义一个分隔符,但用asp.net获取时是以&为分割符。