天天看点

cookie和session

我们对cookie的了解往往停留于浏览器的层面,但cookie其实是http协议的一部分,不管服务器端还是浏览器端都需要遵循它。cookie是由服务器第一次应答请求时生成,然后通知浏览器进行缓存,下一次提交时会把当前所有的cookie都提给浏览器,需要注意cookie并不只一个。

在浏览器端以     key=value;key=value的字符串形式存在,分号隔开的两边各位一个cookie。

cookie在浏览器端是以域名+path保存的,同域名里父path的cookie可以给子path共享。例如:

a) a.xxx.com                       cookie: domain=a.xxx.com;path="/"

b) b.xxx.com                       cookie: domain=b.xxx.com;path="/"      

c) a.xxx.com/test/cc           cookie:

domain=a.xxx.com;path="/test/cc"

d) a.xxx.com/test/bb          cookie:

domain=a.xxx.com;path="/test/bb"

e) a.xxx.com/test

c和d都能共享a的cookie,同样的c和d也能共享e的cookie,c和d以及b和其他cookie之间则无法共享。

cookie共享会导致一个页面存在多个path的情况,这时候浏览器不会做处理,提交到后台时由web服务器的策略做处理,一般而言会默认从最底级的路径往上,取最近的一个。

在tomcat中我们只要在context.xml的<context>标签里加上sessioncookiepath="/"就能做到cookie跨域了。这里所谓的跨域是指a.xxx.com/b和a.xxx.com/c之间cookie共享,这是因为设置这个参数后tomcat是生成cookie时会把cookie的path设成根目录,这样就能全局共享了。

我们知道session是默认会存在cookie里,其实也就是生成一个jessionid的cookie由浏览器缓存起来。这时候我们回过头来再想想我们所认知的session会话周期,我们被教导,浏览器页面关闭,这样session会话就丢失了。这到底对不对?

其实这是值得商榷的,如果cookie是会话级的活着禁用的,那么这是成立的。但如果cookie是会被缓存的,那就不能成立,因为下一次再打开时浏览器会检测到缓存的jsessionid cookie,并把它发给服务器,如果这时候这个jsessionid对应的session并没有被invalidate,那就还会被取出来。

所以我们通常的session失效其实是指cookie丢失,cookie丢了,所以jsessionid丢了,导致服务器端只能重新建立session。

我们可以尝试通过缓存把session持久化下来,然后把cookie的失效周期设成永久有效,这样就会看到即使服务器停掉了再开还是会得到相同的session。

继续阅读