轉自:http://ribbonchen.blog.163.com/blog/static/1183165052011074500877/
之前配置了weblogic通過代理插件weblogic.servlet.proxy.HttpProxyServlet進行代理轉發,實際部署發現代理服務器把第一次請求轉發後,服務器端的session丟失,第二次轉發請求時重新開始了新的session,導致用戶登出無法繼續進行操作。
鼓搗後發現不行,於是另找出路。
重新溫習了一遍cookie和session的相關基礎知識,原來session在服務器端生成後分配的sessionID在客戶端的保存方式是個cookie,它的生命週期在瀏覽器關閉後就會結束,而這個cookie的名字如果不特別設置,weblogic會以默認的名稱“JSESSIONID”來設置這個cookie的名稱,我兩個應用的的session cookie名字都沒有設置,客戶端在第一次通過應用A請求代理轉發到應用B時,應用B返回的同名session cookie覆蓋了客戶端原本的應用A的session
cookie,所以導致了應用A session的丟失。
解決方法是,在應用B的weblogic.xml中的session descriptor標記中添加session cookie的名稱設置,使其區別於A應用的session cookie名稱,如:
<?xml version="1.0"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<session-descriptor>
<cookie-name>MYSESSION</cookie-name>
</session-descriptor>
</weblogic-web-app>
回過頭來看,發現之前鼓搗的http header p3p其實是在已經設好了session cookie的名稱的前提下,解決在iframe中進行跨域訪問時session丟失的問題。
另外,還有一些資料是說可以設置weblogic的session複製,如在weblogic.xml中:
<session-descriptor>
<session-param>
<param-name>PersistentStoreType</param-name>
<param-value>replicated</param-value>
</session-param>
</session-descriptor>
其實這是在weblogic集羣環境中才能起作用,對代理插件weblogic.servlet.proxy.HttpProxyServlet不起作用。