Cookie
- Cookie 是服务器保存在客户端的一小段文本信息,保留了各种追踪信息。每个 Cookie 的大小一般不能超过4KB。客户端每次向服务器发出请求,就会自动附上这段信息。Servlet可以设置、重置、访问、删除Cookie。
Cookie 主要用来分辨两个请求是否来自同一个浏览器,以及用来保存一些状态信息:
Servlet服务器识别用户的三个步骤:- 服务器脚本向客户端发送一组Cookie。包含姓名、年龄等。
- 客户端将这些信息存储在本地,以备使用。
- 当下一次客户端向服务器发送请求是,客户端将会把这些Cookie中的信息发送给服务器,服务器使用这些信息来识别用户。
它的常用场合有以下一些:
- 对话(session)管理:保存登录、购物车等需要记录的信息。
- 个性化:保存用户的偏好,比如网页的字体大小、背景色等等。
- 追踪:记录和分析用户行为。
Servlet处理Cookie时,需要先对中文进行编码和解码:
//编码
String enCodeStr = java.net.URLEncoder.encode("中文","UTF-8");
//解码
String deCodeStr = java.net.URLDecoder.decode("编码后的字符串","UTF-8");
Cookie解析
Cookie包含一下几部分信息:
- Cookie 的名字
- Cookie 的值(真正的数据写在这里面)
- 到期时间
- 所属域名(默认是当前域名)
- 生效的路径(默认是当前网址)
一般在HTTP头文件中设置Cookie(JavaScript可以在浏览器上设置一个Cookie),Servlet通过发送如下头信息来设置Cookie:
HTTP/1.1 200 OK
Date: Fri,04 Feb 2018 09:08:11 GMT
Server: Apache/1.3.9 (UNIX)PHP/4.0b3
Set-Cookie: name=xyz; expires=Friday,04-Feb-07 09:08:11 GMT;
paht=/;domain=gsc.com
Connection: close
Content-Type: text/html
名称和值会被 URL 编码,expires字段是一个指令,告诉浏览器在给定的时间之后遗忘该Cookie。
客户端向服务器发送请求时,若请求与Cookie匹配的域名,路径的页面,就会把Cookie发送给服务器,浏览器的头文件大概如下:
GET / HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/4.6 (X11; I; Linux 2.2.6-15apmac ppc)
Host: zink.demon.co.uk:1126
Accept: image/gif, */*
Accept-Encoding: gzip
Accept-Language: en
Accept-Charset: iso-8859-1,*,utf-8
Cookie: name=xyz
在与Cookie匹配的Servlet中,可以通过request对象访问改Cookie,调用request.getCookies()将得到Cookie对象的数组。
Cookie对象提供以下方法:
方法名 | 描述 |
---|---|
public void setDomain(String pattern) | 该方法设置 cookie 适用的域,例如 runoob.com。 |
public String getDomain() | 该方法获取 cookie 适用的域,例如 runoob.com。 |
public void setMaxAge(int expiry) | 该方法设置 cookie 过期的时间(以秒为单位)。如果不这样设置,cookie 只会在当前 session 会话中持续有效。 |
public int getMaxAge() | 该方法返回 cookie 的最大生存周期(以秒为单位),默认情况下,-1 表示 cookie 将持续下去,直到浏览器关闭。 |
public String getName() | 该方法返回 cookie 的名称。名称在创建后不能改变。 |
public void setValue(String newValue) | 该方法设置与 cookie 关联的值。 |
public String getValue() | 该方法获取与 cookie 关联的值。 |
public void setPath(String uri) | 该方法设置 cookie 适用的路径。如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie。 |
public String getPath() | 该方法获取 cookie 适用的路径。 |
public void setSecure(boolean flag) | 该方法设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送。 |
public void setComment(String purpose) | 设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用。 |
public String getComment() | 获取 cookie 的注释,如果 cookie 没有注释则返回 null |
设置Cookie
通过Servlet设置Cookie有三个步骤:
- 创建Cookie对象
- 设置有效时间
- 添加Cookie到HTTP响应头
创建Cookie对象
Cookie cookie = new Cookie(key,value);
key和value 不可包含[] () = , ” / ? @ : ; 和空格这些字符。
设置最大有效时间
cookie.setMaxAge(second);
已秒为单位,设置Cookie生效的最大时间。
添加Cookie到HTTP响应头
response.addCookie(cookie);
读取Cookie
读取Cookie需通过HttpServletRequest.getCookies() 获得Cookie数组,遍历此数组,即可调用getName()和getValue()方法访问Cookie的值。
Cookie[] cookies = request.getCookies();
Cookie cookie = null;
for(int i = 0; i < cookies.length; i++){
cookie = cookies[i];
String cookieName = cookie.getName();
String cookieValue = cookie.getValue();
}
cookie.getMaxAge()方法不返回设置的MaxAge,只返回-1。所以不可以通过判断过期时间判断Cookie是否过期。当Cookie过期后,Cookie不返回。
删除Cookie
Servlet删除Cookie分为三个步骤:
- 读取Cookie.
- setMaxAge(0)将有效时间设置为0.
- 添加Cookie到HTTP响应头,以此来删除Cookie.
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i].getName().equals("key") || cookies[i].getName().equals("value")) {
cookies[i].setMaxAge(0);
cookies[i].setPath("/");
response.addCookie(cookies[i]);
}
}
}
其中cookies[i].setPath();要根据所要删除的Cookie而有所区别,”/”是项目路径的所有Cookie,也可以是(“/CookieServlet/TestServlet”)等指定的Servlet设置的Cookie。
参考:菜鸟教程http://www.runoob.com/servlet/servlet-cookies-handling.html 等。