如果步骤5携带的是过期的cookie或者是错误的cookie,那么将认证失败,返回至要求身份认证页面。
当前 Cookie 有两个版本:Version 0 和 Version 1。通过它们有两种设置响应头的标识,分别是 “Set-Cookie”和“Set-Cookie2”。这两个版本的属性项有些不同,表 10-1 和表 10-2 是两个版本的属性介绍。
表Version 0 属性项介绍
属性项 | 属性项介绍 |
---|---|
NAME=VALUE | 键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样 |
Expires | 过期时间,在设置的某个时间点后该 Cookie 就会失效,如 expires=Wednesday, 09-Nov-99 23:12:40 GMT |
Domain | 生成该 Cookie 的域名,如 domain="xulingbo.net" |
Path | 该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/ |
Secure | 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie |
表Version 1 属性项介绍
属 性 项 | 属性项介绍 |
---|---|
NAME=VALUE | 与 Version 0 相同 |
Version | 通过 Set-Cookie2 设置的响应头创建必须符合 RFC2965 规范,如果通过 Set-Cookie 响应头设置,默认值为 0,如果要设置为 1,则该 Cookie 要遵循 RFC 2109 规范 |
Comment | 注释项,用户说明该 Cookie 有何用途 |
CommentURL | 服务器为此 Cookie 提供的 URI 注释 |
Discard | 是否在会话结束后丢弃该 Cookie 项,默认为 fasle |
Domain | 类似于 Version 0 |
Max-Age | 最大失效时间,与 Version 0 不同的是这里设置的是在多少秒后失效 |
Path | 类似于 Version 0 |
Port | 该 Cookie 在什么端口下可以回传服务端,如果有多个端口,以逗号隔开,如 Port="80,81,8080" |
Secure | 类似于 Version 0 |
以上两个版本的 Cookie 中设置的 Header 头的标识符是不同的,我们常用的是 Set-Cookie:userName=“junshan”; Domain=“xulingbo.net”,这是 Version 0 的形式。针对 Set-Cookie2 是这样设置的:Set-Cookie2:userName=“junshan”; Domain=“xulingbo.net”; Max-Age=1000。但是在 Java Web 的 Servlet 规范中并不支持 Set-Cookie2 响应头,在实际应用中 Set-Cookie2 的一些属性项却可以设置在 Set-Cookie 中,如这样设置:Set-Cookie:userName=“junshan”; Version=“1”;Domain=“xulingbo.net”;Max-Age=1000。
Cookie的作用:
1.解决了认证(登录)后,下次访问还需要认证(登录)的重复认证问题。
2.可以记住用户名和密码,增强用户体验。
Cookie的缺点:
1.安全问题
cookie数据保存在客户端,有可能被篡改或盗取。
Cookie 数据可以被访问到,就像我们前面通过 Firefox 的插件 HttpFox 可以看到所有的 Cookie 值。不仅可以查看 Cookie,甚至可以通过 Firecookie 插件添加、修改 Cookie,所以 Cookie 的安全性受到了很大的挑战。
相比较而言 Session 的安全性要高很多,因为 Session 是将数据保存在服务端,只是通过 Cookie 传递一个 SessionID 而已,所以 Session 更适合存储用户隐私和重要的数据。
2.数据传输量大的问题
cookie 可以让服务端程序跟踪每个客户端的访问,但是每次客户端的访问都必须传回这些 cookie,如果 cookie 很多,这无形地增加了客户端与服务端的数据传输量,而 Session 的出现正是为了解决这个问题。
浏览器会附带具有相同域名的所有cookie,如果是二级域名,顶级域名的cookie也会一起附带。
同一个客户端每次和服务端交互时,不需要每次都传回所有的 Cookie 值,而是只要传回一个 ID,这个 ID 是客户端第一次访问服务器的时候生成的,而且每个客户端是唯一的。这样每个客户端就有了一个唯一的 ID,客户端只要传回这个 ID 就行了,这个 ID 通常是 NANE 为 JSESIONID 的一个 Cookie。
3. 浏览器对cookie的数量和大小有限制
Session的三种工作方式:
1. 基于 URL Path Parameter,默认支持。
2. 基于 Cookie,如果没有修改 Context 容器的 cookies 标识,默认也是支持的。
3. 基于 SSL,默认不支持,只有 connector.getAttribute("SSLEnabled") 为 TRUE 时才支持。