限制多窗口重複登陸

我們都知道WEB服務器通過識別客戶請求中的session id來判斷是否返回新的HttpSession,一般情況下這個session ID是保存在客戶端cookie中,準確的說是保存在session cookie中。 也就是說一旦關閉瀏覽器,此session cookie消失,保存其中的session ID也隨之消失。再新建的瀏覽器再次發起請求時,服務器端找不到對應的session ID就會新建一個HttpSession返回給客戶。


現在要求系統防止用戶短時間內多次發起同一請求給APP造成業務處理壓力,於是在用戶登陸後第一次發起此請求時記錄當前時間保存到Session中,並且在下次發起相同請求時從Session中去除上次請求時間計算時間差,小於5min時給出提示並駁回請求。但是因爲存在上述的問題,聰明(還是狡猾的?)客戶利用多次開關瀏覽器便可以突破這個限制。我現在在想是否能將session ID保存到客戶端硬盤的cookie上,即cookie.setMaxAge(N); N>0的方法。但是貌似session ID不能保存到持久化cookie上,不知道各位有沒有什麼辦法?


另外,如果能順利地將session ID保存到持久化cookie上,會出現另外一個問題。不同用戶在同一臺pc上登陸系統,卻發送相同的session ID給服務器,顯然不對。因此,得讓存在持久化cookie上的session ID根據系統登陸用戶不同而不同,這需要在把cookie放到HTTP HEAD之前,拿到session ID並根據當前登陸用戶做處理。不過對cookie的處理是在服務器端執行reqeust.getSession()的時候直接去cookie中的JSESSIONID屬性,我怎麼

才能讓cookie中保存多個JSESSIONID呢


順便提一下,我們生產環境上4臺WEB SERVER,配置了Session共享和session粘性,即對客戶來說,就跟只有一臺WEB一樣。另外,我們有SSO,但是cookie.setMaxAge(-1);於是跨瀏覽器的話Session又是新的了

[quote="case0079"]URL REWRITE[/quote]
URL REWRITE前提是服務器端給返回一個JSESSIONID,但如果客戶端給過去的jsessionid每次都不同,如何指望返回來的東東的正確性呢。
同上,棘手的不是server side,而是client side

[quote="鳳舞凰揚"][quote]好像服務器就是根據session id來判斷是否是同一個用戶的,如果是一有的seesion id,則會將請求分流到之前處理這個請求的節點上。現在的問題是session id在每次IE關掉之後在客戶端都沒有了,服務器沒辦法進行識別。
不知道我的理解是否正確 [/quote]
我們常說的session id是服務器判斷與之相連接的客戶端的會話,實質上,和我們另外一個角度理解的用戶是有區別的。你說的沒錯,如果已經存在session,就轉發。不過後面一句就陷進去了。其實我前面說過,你需要傳遞另外一個東西,jsessionId,你在很多網站都可以看到這種應用(尤其是IBM的),對於轉發服務器來說,是否存在http session並不重要,沒有創建一個就是。你session中存儲的數據並不在其中,而是在你對應的JVM節點中,而它是可以通過jsessionId這樣的方式去獲取的。
至於說怎麼識別這樣的東西,其實所有的支持負載均衡多個JVM節點並存的服務器都支持。或者大不了如樓上所說,自己建立中央緩存,自己在程序中識別這樣的request參數。[/quote]

大概明白您的意思了。即把session id存放在JVM SESSION中而非HTTP SESSION中,跟之前那位兄弟提到的memcache方案基本相似。但關鍵是,這個seesion id在第一次被HttpSession返回來後,如果想在下次發起請求是將其原樣送給服務器,就必須有一個機制在客戶端能讓其存活下來,而以瀏覽器爲單位的session cookie是做不到的。

也就是說,問題的關鍵不是服務器端沒辦法識別jsessionid,而是這個jsessionid在客戶端沒法持久化。除非...我能通過在客戶端JS上自己動手僞造一個跟登錄客戶ID相關的jsessionid出來
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章