我有兩種不同的webapps在一臺服務器上運行,使用不同的端口。他們都運行Java的Jetty servlet容器,因此他們都使用名爲JSESSIONID的cookie參數來跟蹤會話ID。這兩個webapps正在爭奪會話ID。JSESSIONID在同一ip但不同端口上的兩臺服務器之間的衝突
- 打開Firefox的標籤,並轉到WebApp1
- WebApp1的HTTP響應有一個Set-Cookie頭JSESSIONID = 1
- 火狐現在有JSESSIONID一個Cookie標頭中的所有= 1是HTTP請求WebApp1
- 打開第二個Firefox標籤,並轉到webapp2的
- 的HTTP reqeust到webapp2的也有JSESSIONID = 1 Cookie頭,但在的doGet,當我打電話
req.getSession(false);
我得到null
。如果我呼叫req.getSession(true)
,我得到一個新的會話對象,但是然後來自WebApp2的HTTP響應具有一個帶有JSESSIONID = 20的set-cookie頭。現在,WebApp2有一個工作會話,但WebApp1的會話不見了。去WebApp1會給我一個新的會話,吹走WebApp2的會話。 - 永遠繼續下去
所以Session是每個Web應用程序之間的抖動。如果已經定義了JSESSIONID cookie,我真的很希望req.getSession(false)
能夠返回有效的會話。
一個選擇是基本上用HashMap和Cookie重新實現Session框架,這個框架叫做WEBAPP1SESSIONID和WEBAPP2SESSIONID,但這很糟糕,並且意味着我不得不將新會話內容破解到ActionServlet和其他一些地方。
這一定是別人遇到的問題。 Jetty的HttpServletRequest.getSession(boolean)
只是蹩腳的?
我的問題是,當碼頭去創建一個新的會話,在默認情況下,它甚至不嘗試使用JSESSIONID的現有價值。它只是爲它選擇一個新的價值。如果它重複使用現有的,那麼我的兩個Jetty實例可以很好玩。 – 2009-07-20 19:27:47