1. 程式人生 > >就最近一段時間,就遇到了兩次session id 一直變化的,所以做個總結。

就最近一段時間,就遇到了兩次session id 一直變化的,所以做個總結。

1.  第一種出現是在一個專案裡面這裡叫A專案,需要嵌入另外一個專案這裡叫B專案,通過iframe (IE會出現)

     通過iframe引入   B專案  因為B專案裡面有登入攔截,所以在A專案裡面會請求登入一下,可是隻要一請求B專案,就一直停留在請登入

     除錯後發現每次請求都會產生一個全新的sessionid,所以才會一直出現請重新登入的介面。問題是找到了(ps:只要可以登入,到時候通過iframe就可以引入自己需要的B專案頁面了)要怎麼解決呢?

    百度了以後發現,IE會丟失iframe中的cookie,而session其實就是基於cookie的,客戶端在第一次與伺服器進行會話時,會分配給客戶端sessionid儲存在cookie中,然後在後面的請求中,會帶上cookie, 現在IE會丟失iframe中的cookie,所以伺服器會重新分配給客戶端sessionid ,所以會提示一直需要登入

   所以只要設定一下p3p就可以了。

   P3P(Platform for Privacy Preferences)正是一種可以提供這種個人隱私保護策略,一般瀏覽器都支援P3P協議。P3P header允許跨域訪問隱私資料,從而可以跨域set-cookie成功

我是在B專案的攔截器裡面加了一個p3p協議設定的程式碼

  HttpServletResponse res = (HttpServletResponse) ServletActionContext.getResponse();

  res.setHeader("P3P","CP=CAO PSA OUR");

2.第二種是出現在外網訪問的地方,第二種出現的情況是基於第一種,就是我們的A專案和B專案本來是在內網部署的,然後需要給領導看,叫網管把我們這兩個專案的地址給對映到外網了。登入A專案的時候,一直提示,請重新登入

   一除錯,還是一樣的問題,sessionid一直在變化,那這個是什麼原因呢?

   後面百度得知:因為我們的A專案和B專案對映到外網以後是ip一致,然後埠不同而已,這樣子會造成session衝突

    IP相同認為是 同一個域,接收了B的set-cookie指令,把對應的cookie內容覆蓋了,其中包括sessionid,造成A的session丟失。 如果 IP不同,則不會發生這個問題。IP相同的兩個session對應的cookie是一樣的,而不幸的是sessionID就儲存在cookie中,這樣先訪問A,再訪問B的時候,B的sessionid會覆蓋A的sessionid。這個事情沒辦法解決,所以不能弄兩個埠,要弄兩個外網ip。都是cookie出現的問題,它不會區分埠,造成這多個站點不斷的覆蓋前面的,從而造成session的丟失


所以在此做了一個總結