Cookies是一种结构化的数据,是由web服务器返回给请求的一个服务器响应的一部分。Cookie可以通过设置HTTP响应头来进行设置。无论什么时候发送请求,浏览器都会把cookie作为请求头的一部分返回给服务器。请求发送的目的是为了能够更新cookie里面的值。同时,无论数据有没有改变,cookies也总是会占据HTTP响应头的一部分。
Cookie实际上是一小段的文本信息,大小4BK左右,通过加后密存放客户端。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
在 HTML 文档被发送之前,Web 服务器通过传送 HTTP 包头中的 Set-Cookie 消息把一个 cookie 发送到用户的浏览器中.如:
Set-Cookie:customer=huangxp; path=/foo; domain=.ibm.com; expires= Wednesday, 19-OCT-05 23:12:40 GMT;[secure]
Set-Cookie 的每个属性解释如下:
1、Customer=huangxp 一个”名称=值”对,把名称 customer 设置为值”huangxp”,这个属性在 Cookie 中必须有。
2、path=/foo 控制哪些访问能够触发 cookie 的发送。如果没有指定 path,cookie 会在所有对此站点的 HTTP 传送时发送。如果 path=/directory,只有访问 /directory 下面的网页时,cookie 才被发送。在这个例子中,用户在访问目录 /foo 下的内容时,浏览器将发送此 cookie。如果指定了 path,但是 path 与当前访问的 url 不符,则此 cookie 将被忽略。
3、domain=.ibm.com 指定 cookie 被发送到哪台计算机上。正常情况下,cookie 只被送回最初向用户发送 cookie 的计算机。在这个例子中,cookie 会被发送到任何在 .ibm.com 域中的主机。如果 domain 被设为空,domain 就被设置为和提供 cookie 的 Web 服务器相同。如果 domain 不为空,并且它的值又和提供 cookie 的 Web 服务器域名不符,这个 Cookie 将被忽略。
4、expires= Wednesday, 19-OCT-05 23:12:40 GMT 指定 cookie 失效的时间。如果没有指定失效时间,这个 cookie 就不会被写入计算机的硬盘上,并且只持续到这次会话结束。
5、secure 如果 secure 这个词被作为 Set-Cookie 头的一部分,那么 cookie 只能通过安全通道传输(目前即 SSL 通道)。否则,浏览器将忽略此 Cookie。
一旦浏览器接收了 cookie,这个 cookie 和对远端 Web 服务器的连续请求将一起被浏览器发送。例如 前一个 cookie 被存入浏览器并且浏览器试图请求 URL 时,下面的 HTTP 包头就被发送到远端的 Web 服务器。
一次典型的网络浏览过程
浏览器对于 Web 服务器应答包头中 Cookie 的操作步骤:
1. 从 Web 服务器的应答包头中提取所有的 cookie。
2. 解析这些 cookie 的组成部分(名称,值,路径等等)。
3. 判定主机是否允许设置这些 cookie。允许的话,则把这些 Cookie 存储在本地。
浏览器对 Web 服务器请求包头中所有的 Cookie 进行筛选的步骤:
1. 根据请求的 URL 和本地存储 cookie 的属性,判断那些 Cookie 能被发送给 Web 服务器。
2. 对于多个 cookie,判定发送的顺序。
3. 把需要发送的 Cookie 加入到请求 HTTP 包头中一起发送。
代码
//根据Key获取Cookie
public static Cookie getCookies(HttpServletRequest request,
String key) {
// 从 request 中获取所有的 Cookie
Cookie[] cookies = request.getCookies();
if (null == cookies || cookies.length <= 0) {
return null;
}
for (Cookie c : cookies) {
if (key.equals(c.getName())) {
return c;
}
}
return null;
}
//新增或更新cookie
public static void setCookies(HttpServletRequest request,
HttpServletResponse response, String key, String value,
boolean isAutomatic) {
Cookie cookie = getCookies(request, key);
if (cookie == null) {
cookie = new Cookie(key, URLEncoder.encode(value,"UTF-8"));
cookie.setPath("/");
if (isAutomatic) {
cookie.setMaxAge(7 * 24 * 3600);
}
} else {
cookie.setPath("/");
cookie.setValue(value);
}
response.addCookie(cookie);
}