我們對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。