一、什么是Cookie?
Cookie,有时也用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于 RFC2109 和 2965 中的Cookie规范都已废弃,最新取代的规范是RFC6265 。
二、Cookie的用途
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。
Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,如果该Cookie尚未到期,浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
三、Cookie的缺陷
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。
- Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。
四、Cookie的生命周期
Cookie的生命周期可以通过cookie.setMaxAge(int expiry)方法设置,具体规则如下:
-
expiry > 0:当expiry大于0时(一般设置为1),浏览器不仅会把cookie保存在浏览器内存中,还会把cookie保存到硬盘上,
例:cookie.setMaxAge(60*60),表示cookie将存活一个小时,无论是否重启浏览器、或是系统。 -
expiry < 0:当expiry小于0时(一般设置为-1),表示只在浏览器内存中存活。一旦关闭浏览器窗口,那么cookie就会消失。
-
expiry = 0:当expiry等于0时,表示cookie即不在内存中存活,也不在硬盘上存活,这样的cookie设置只有一个目的,那就是覆盖客户端原来的这个cookie,使其作废。
五、javax.servlet.http.Cookie API及其他相关操作
1、cookie常用API
方法名 | 描述 |
---|---|
String getComment() | 返回描述此cookie用途的注释,如果cookie没有注释,则返回null。 |
int getMaxAge() | 以秒为单位,返回cookie的有效期。默认情况下为-1,表示cookie将持续存在直到浏览器关闭。 |
void setMaxAge(int expiry) | 以秒为单位,设置cookie的有效期 |
String getName() | 返回cookie的名称。 |
void setValue(String newValue) | 设置cookie的值 |
String getValue() | 返回cookie的值。 |
2、服务器端对cookie的操作
-
获取客户端发送的cookie
httpServletRequest.getCookies(); -
创建并向客户端发送cookie
Cookie cookie = new Cookie(“cookieName”, “cookieValue”);
httpServletResponse.addCookie(cookie);