34-Cookie技术
Cookie
javax.servlet.http.Cookie
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Java Servlet 显然支持 HTTP Cookie。
cookie是通过response的消息头发送到浏览器中(Set-Cookie:), 当发送给浏览器的cookie重名时会覆盖之前的cookie
识别返回用户包括三个步骤:
- 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等。
 - 浏览器将这些信息存储在本地计算机上,以备将来使用。
 - 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户。
 
Cookie原理

编码处理
Servlet Cookie 处理需要对中文进行编码与解码,但是是针对Tomcat8.0及8.0以下的版本,在Tomcat8.5及8.5以后的版本中已经解决了该问题!
HTTP协议中规定了请求信息和响应信息中不能包含中文数据!比如你提交的中文可能会变成这样%E5%BC%A0%E9%A3%9E%E9%A3%9E
将中文数据转成下面这种格式,叫做URL编码:
张飞飞 ---> URL编码 ---> %E5%BC%A0%E9%A3%9E%E9%A3%9E
将下面这种格式再次转回中文数据,叫做URL解码:
%E5%BC%A0%E9%A3%9E%E9%A3%9E ---> URL解码---> 张飞飞
当cookie中保存中文数据,将cookie添加到响应中时,会报一个500异常,如下:
Control character in cookie value or attribute

解决方法如下:
- 
编码: 中文字符-->url编码
String str = java.net.URLEncoder.encode("中文","UTF-8"); - 
解码: url编码-->中文字符
String str = java.net.URLDecoder.decode("编码后的字符串","UTF-8"); 
Cookie方法
| 修饰符,返回值 | 方法 | 说明 | 
|---|---|---|
public String | 
 getName() | 
该方法返回 cookie 的名称。 名称在创建后不能改变。  | 
public void | 
setValue(String newValue) | 
该方法设置与 cookie 关联的值。 | 
public String | 
getValue() | 
该方法获取与 cookie 关联的值。 | 
public void | 
setMaxAge(int expiry) | 
该方法设置 cookie 过期的时间(以秒为单位)。 -1 表示 cookie 将一直持续下去 如果不设置,cookie 只会在浏览器内存 会话中持续有效。  | 
public int | 
getMaxAge() | 
该方法返回 cookie 的最大生存周期(以秒为单位) 默认情况下,-1 表示 cookie 将持续下去, 直到浏览器关闭。  | 
public void | 
setDomain(String pattern) | 
该方法设置 cookie 适用的域.(例如aarons.top) | 
public String | 
getDomain() | 
该方法获取 cookie 适用的域.(例如aarons.top) | 
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。 | 
Servlet操作Cookie
通过 Servlet 设置 Cookie
// 创建Cookie对象
Cookie cookie = new Cookie("key","value");
// 设置 cookie 过期的时间(1天后失效)
cookie.setMaxAge(60*60*24);
// 把cookie添加到响应头
response.addCookie(cookie);
如果不使用setMaxAge(int expiry)设置Cookie, Cookie只会贮存在浏览器内存中, 当浏览器关闭后就会失效
请记住,无论是名字还是值,都不应该包含空格或以下任何字符:
[ ] ( ) = , " / ? @ : ;
通过 Servlet 读取 Cookie
要读取 Cookie,您需要通过调用 HttpServletRequest 的 getCookies( ) 方法创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个 cookie 和关联的值。
// 获取从浏览器发送过来的Cookie
Cookie[] cookies = request.getCookies();
// 遍历coolies, 并获取每一个cookie的name和value
for (Cookie cookie : cookies) {
    String name = cookie.getName();
    String value = cookie.getValue();
}
通过 Servlet 删除 Cookie
删除 Cookie 是非常简单的。如果您想删除一个 cookie,那么您只需要按照以下三个步骤进行:
- 读取一个现有的 cookie,并把它存储在 Cookie 对象中。
 - 使用 
setMaxAge(0)方法设置 cookie 的年龄为零,来删除现有的 cookie。 - 把这个 cookie 添加到响应头。
 
删除所有cookie:
// 读取浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
// 遍历所有cookie, 并设置所有的cookie的过期时间都设置为0
for (Cookie cookie : cookies) {
    cookie.setMaxAge(0);
    response.setCookie(cookie);
}
                
            
        
浙公网安备 33010602011771号