1.Cookie
cookie数据存放在客户端,一般用于记录用户身份等信息。
由于http是一种无状态协议,服务器无法从网络连接中知道客户身份,因此就诞生了cookie,可以作为通行证。
cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户的状态,就向客户端浏览器颁发一个cookie。客户端浏览器会把cookie保存在内存中(有需要的话可以存在本地硬盘中,存在内存中的会在浏览器关闭后失效)。当浏览器再请求该网站时,浏览器把请求的网址连同该cookie一起提交给服务器。服务器检查该cookie,以此来辨认用户状态,服务器还可以根据需要修改cookie的内容。
在浏览器地址栏输入javascript:alert(document.cookie),回车,就能够看到该网站的cookie。cookie具有不可跨域名性,访问不同的网站之能携带对应的cookie。
cookie常用属性:
String name:该Cookie的名称,一旦创建,名称便不可更改
Object value:该Cookie的值,如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码
int maxAge:该cookie失效时间,单位秒。如果为正数,则Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存Cookie.如果为0,表示删除Cookie。默认是-1。Integer.MAX_VALUE表示永远有效
boolean secure:该Cookie是否仅被使用安全协议传输。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false,secure并不能对Cookie内容加密,因而不能保证绝对的安全性。如果
需要高安全性,需要在程序中对Cookie内容加密,解密,以防泄密
String path:该Cookie使用路径。如果设置为”/sessionWeb/”,则
只有contextPath为”/sessionWeb”的程序可以访问该Cookie。如果设置为”/”,则本域名下contextPath都可以访问该Cookie.注意最后一个字符必须为“/”
String domain:可以访问该Cookie的域名。如果设置为”.google.com”,则所有以”google.com”结尾的域名都可以访问该Cookie。注意第一个字符必为“.”
String comment:该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明
int version:该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC2109规范
注意:浏览器提交Cookie时只会提交NAME与VALUE的值修改,删除Cookie时,新建的Cookie除value,maxAge之外的所有属性,如name,path,domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改,删除失败。
2.Session
session是另一种记录客户状态的机制,将数据保存在服务器上,如果说cookie具有通行证的作用,那么session则是检查官,为来访用户简历一份客户档案并验证来访用户的通行证。
服务器会为多个用户保存session,session的值可以使各种类型的变量或常量,因此session的使用比cookie方便,但过多的session会个服务器造成压力。
session在用户第一次访问服务器的时候自动创建,并持续维护一段时间直到超时。
以下情况会导致session失效:
a)bin目录中的文件被改写。在asp.net之中有一种机制,为了保证dll重新编译之后系统正常运行,它会重新启动一次网站进程,这时候就会导致session丢失。
b)sessionId丢失或者无效。如果你在url中存储sessionId,但是使用了绝对地址重定向望着那导致url中的sessionId丢失,那么原来的session将失效。如果你在cookie中存储sessionId,那么客户端禁用或者cookie达到了browser中cookie数量的限制,那么session将无效。
c)如果使用InProc的session,那么IIS重启将会丢失session
3.cookie和session的联系
虽然session保存在服务器内存,对客户是透明的,它的正常运行仍然需要客户端浏览器的支持。原因是http的无状态,session不能依据http连接来获取用户,因此服务器使用cookie作为识别标志:向客户端浏览器发送类似于名为jsession的cookie,值为session的id(HttpSession.getId()可以返回该值)。
该cookie是服务器自动生成,它的maxAge属性一般为-1,仅当前浏览器有效,并且各浏览器窗口之间不共享,关闭浏览器随即失效。因此同一机器的两个浏览器访问服务器时,会生成两个不同的session,但是由浏览器窗口内的连接、脚本等打开的心窗口,这类子窗口会共享父窗口的cookie,因此也会共享一个session。
session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我们叫做session cookie,以区别persistent cookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,但是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid。通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。
参考:
http://blog.csdn.net/chen_fuming/article/details/17802051
http://sumongh.iteye.com/blog/82498
http://blog.csdn.net/shuaishenkkk/article/details/8634917
http://www.360doc.com/content/11/1227/00/198_175229712.shtml