2015-09-16 30 views
0

我正在與Spring 4 mvc應用程序一起使用mysql數據庫,tomcat服務器。 基本上,我正在創建一個將由Angular JS使用的Spring休息。使用Cookies避免Spring Rest應用程序中的會話複製

注:我不使用Spring security

爲了避免在clustered environment情況下會話複製,我使用cookie approach.On登錄,我生成one unique session idusing java UUID),並用它來創建一個cookie,然後在響應中設置cookie。並將該會話ID與任何用戶數據一起存儲在數據庫中。

爲了驗證每個剩餘的API,我寫了一個Spring interceptor,它將攔截每個其他API調用,然後檢查請求中是否存在cookie。如果存在,我獲取會話id值並使用它通過數據庫調用來檢查它是否有效。在註銷時,我正在刪除cookie。

對我在做什麼的基礎上面所解釋的,我有幾個問題:

1) Is my approach correct? or do you see any flaw in it. 
2) Let me know if there is any other better method to achieve the same i.e. to avoid session replication. 
3) Since, I am not using any HTTP session, how do I achieve something like session-timeout or do i even need it? 

回答

0

1)是我的做法正確嗎?或者你看到它的任何缺陷。

它是一個很好的方法。只是幾個百分點,雖然在優先順序: -

  • 如果您使用的API來服務很多請求再想想使用內存高速緩存而不是DB。去DB是相對昂貴的。 很多是主觀我知道,它取決於你的設置,但只考慮數據庫你想超越會議生活的數據。最好使用諸如內存緩存之類的更臨時/更快的存儲區,以獲取API令牌等內容。如果跨羣集,則探索分佈式緩存解決方案。

  • 使用Cookie不一定是安全風險,但有一點關於CSRF的閱讀。更安全的將標記傳遞給HTTP標頭而不是cookie本身 - 也就是說,如果您關心CSRF(我在自己的應用程序中使用Header方法,但我認爲CSRF相對較少,這取決於您的敏感程度數據)

2)讓我知道是否有任何其他更好的方法來達到同樣的 即避免會話複製。

沒有過度反應1)添加

3)因爲,我沒有使用任何HTTP會話,我該如何實現像會話超時或者我甚至需要它嗎?

存儲(最好在緩存中)帶有令牌的時間戳,並將其刷新到使用該令牌的每個事務的緩存中。然後,在檢查是否考慮令牌是否有效時,檢查時間戳,並且您可以決定(基於時間流逝)是否希望刪除令牌並請求客戶端重新進行驗證。