1.什么是cookie?
1.Cookie是由HTTP服务器设置的,保存在浏览器中,但HTTP协议是一种无状态协议,在数据交换完毕后,服务器端和客户端的链接就会关闭,每次交换数据都需要建立新的链接。就像我们去超市买东西,没有积分卡的情况下,我们买完东西之后,超市没有我们的任何消费信息,但我们办了积分卡之后,超市就有了我们的消费信息。cookie就像是积分卡,可以保存积分,商品就是我们的信息,超市的系统就像服务器后台,http协议就是交易的过程。
2.Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,对于JSP而言也可以直接写入jsessionid,这样服务器可以知道该用户是否合法用户以及是否需要重新登录等。
2.用在什么地方?
1.用户登录的判断,对http请求无状态的,在浏览器一段,识别的机制。
2.普通网站都不会存重要的信息,它们仅仅存一个你的登陆状态,也就是你拿用户名密码换取的令牌,还有就是网站针对你的判定(比如你在这个网站上的唯一标识是什么,你访问的是我们的哪台服务器,你使用的是我们的哪个版本的产品),这些信息你都不需要关心,它和你的隐私一点关系都没有。
文艺一点的网站会将这些信息进行加密,目的是防止别人伪造这些信息欺骗网站
3.一般用在,验证用户是否登录的一种机制
3.使用方法
在Servlet API 中,使用java.servlet.http.Cookie类来封装一个Cookie消息,在HttpServletResponse接口中定义了一个addCookie()方法来向浏览器发送Cookie对象,在HttpServletRequest接口中定义了一个getCookies()方法来读取浏览器传递过来的Cookie消息。Cookie类中定义了生成和获取Cookie消息的各个属性的方法。Cookie类只有一个构造方法:
public Cookie(String name, String value) {
if (name == null || name.length() == 0) {
throw new IllegalArgumentException(
lStrings.getString("err.cookie_name_blank"));
}
if (!isToken(name) ||
name.equalsIgnoreCase("Comment") || // rfc2019
name.equalsIgnoreCase("Discard") || // 2019++
name.equalsIgnoreCase("Domain") ||
name.equalsIgnoreCase("Expires") || // (old cookies)
name.equalsIgnoreCase("Max-Age") || // rfc2019
name.equalsIgnoreCase("Path") ||
name.equalsIgnoreCase("Secure") ||
name.equalsIgnoreCase("Version") ||
name.startsWith("$")) {
String errMsg = lStrings.getString("err.cookie_name_is_token");
Object[] errArgs = new Object[1];
errArgs[0] = name;
errMsg = MessageFormat.format(errMsg, errArgs);
throw new IllegalArgumentException(errMsg);
}
this.name = name;
this.value = value;
}
/*其中name表示Cookie名(在name参数值中不能包含任何空格字符、逗号、分号,并且不能以$字符开头),value表示Cookie 的值。Cookie类的其它常用方法:
getName():该方法返回Cookie 的名称。
setValue()和getValue() :这两个方法分别用于设置和获取Cookie的值。
setMaxAge()和getMaxAge() :这两个方法分别用于设置和获取Cookie在客户端的有效时间(以秒为单位)。如果设置为0,表示当Cookie消息发送到客户端浏览器时被立即删除。如果设置为负数,表示浏览器并不会把这个Cookie保存在硬盘上,这种Cookie被称为临时Cookie(保存在硬盘上的Cookie被称为永久Cookie),它们只存在于当前浏览器的进程中,当浏览器关闭后,Cookie自动失效。对于IE浏览器,不同的窗口不能共享临时Cookie,但按Ctrl+N快捷键或使用JavaScript的window.open语句打开的窗口由于和它们的父窗口属于同一个浏览器进程,因此它们可以共享临时Cookie。而在FireFox中,所有的进程和标签页都可以共享临时Cookie。
setPath和getPath方法:这两个方法分别用于设置和获取当前Cookie的有效Web路径。如果在创建某个Cookie时为设置它的path属性,那么该Cookie只对当前访问的Servlet所在的Web路径及其子路径有效。如果想使Cookie对整个Web站点中的所有可访问的路径都有效,需要将path属性值设置为"/" 。
setComment和getComment方法:这两个方法分别用于设置和获取当前Cookie 的注释部分。
setVersion和getVersion方法:这两个方法分别用于设置和获取当前Cookie的协议版本。
setSecure和getSecure方法:这两个方法分别用于设置和获取当前Cookie是否只能使用安全的协议传输Cookie。
/*
2.代码使用
public static final String APP_NAME ="xxq";
public static final String DEFAULT_COOKIE_DOMAIN = "127.0.0.1";
/**
*存储cookie
*/
public static void saveOrUpdateCookie(String key, String value, HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
boolean isCookieExist = false;
key = APP_NAME + key;
value = enSecret(value);
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length != 0) {
for (Cookie cookie : cookies) {
// 判断cookie是否存在,存在则更新cookie
if (cookie.getName().equals(key)) {
cookie.setValue(value);
cookie.setPath("/");
if (!StringUtils.isEmpty(DEFAULT_COOKIE_DOMAIN)) {
cookie.setDomain(DEFAULT_COOKIE_DOMAIN);
}
cookie.setMaxAge(-1);
response.addCookie(cookie);
isCookieExist = true;
break;
}
}
}
// 如果cookie不存在则新创建cookie
if (!isCookieExist) {
Cookie cookie = new Cookie(key, value);
cookie.setPath("/");
if (!StringUtils.isEmpty(DEFAULT_COOKIE_DOMAIN)) {
cookie.setDomain(DEFAULT_COOKIE_DOMAIN);
}
cookie.setMaxAge(-1);
response.addCookie(cookie);
}
}
/**
*查询cookie
*/
public static String getFromCookie(String key, HttpServletRequest request) {
Cookie[] cookie = request.getCookies();
if (cookie == null) {
return null;
}
key = APP_NAME + key;
for (int i = 0; i < cookie.length; i++) {
if (cookie[i].getName().equals(key)) {
try {
String res = cookie[i].getValue();
if (!StringUtils.isEmpty(res)) {
return deSecret(res).trim();
} else {
return "";
}
} catch (Exception e) {
LOG.error(e.getMessage(), e);
return null;
}
}
}
return null;
}
参考资料:
https://blog.csdn.net/chuan_zhang_ak/article/details/52077151