理解Cookie和Sessin机制

常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

Cookie执行机制

1.当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器

2.服务器向客户端回传相应的超文本并在HTTP响应头(Response Header)里发回用户的个人信息。在响应头里面会有一个Set-Cookie字段,这是用来指示客户端建立一个cookie

3.客户端浏览器接收来自服务器的响应,并将这些信息存放在一个统一的位置,这个位置可能是内存也有可能是硬盘。

4.当客户端要再向服务器发送请求时,就会在HTTP的请求头里加入cookie(一小段的文本信息)

5.服务器就根据cookie来识别客户端的身份,从而动态生成与该客户端相对应的内容。

1

Cookie属性

String name:cookie名称

Object value:cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码。

int maxAge:cookie的失效时间,单位为秒。如果为正数,则该Cookie在>maxAge秒之后失效,这时无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1。

boolean secure:该cookie是否使用安全传输协议,默认为false

String path:cookie使用路径。如果设置为/sessionWeb/,则只有contextPath为/sessionWeb的程序可以访问该Cookie。如果设置为/,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为/

String comment:cookie用处说明

int version:cookie版本号

String domain:可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie

Cookie的不可跨域名性

例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要把Cookie的domain参数设置成.helloweenvsfei.com

Cookie的修改、删除

修改:新建一个同名的Cookie,添加到response中覆盖原来的Cookie。

删除:新建一个同名的Cookie,将maxAge设置为0,并添加到response中覆盖原来的Cookie。

注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖。