javascript
REST + Spring Security会话问题
因此,我們可以擴(kuò)展應(yīng)用程序,添加新節(jié)點(diǎn),刪除節(jié)點(diǎn),而無(wú)需考慮會(huì)話復(fù)制以及消耗的Java堆內(nèi)存。
最近,我一直在從事高負(fù)載REST應(yīng)用程序。 實(shí)際上,我們并不期望在那里有很高的流量,但是令人驚訝的是,我們已經(jīng)為我們準(zhǔn)備了更高的流量(這就是所謂的“快樂(lè)問(wèn)題”)。 應(yīng)用程序基于Spring框架 ,并通過(guò)部署在Apache Tomcat 7上的Spring Security進(jìn)行保護(hù)。 所有資源都是完全無(wú)狀態(tài)的–我的任何代碼都沒(méi)有觸及HttpSession。 不幸的是,直到以下時(shí)間為止,用過(guò)的Java堆空間一直在增加:
java.lang.OutOfMemoryError: Java heap space被扔了。 為了分析Java堆轉(zhuǎn)儲(chǔ)和堆的運(yùn)行時(shí)使用情況,我使用了VisualVM 。
堆轉(zhuǎn)儲(chǔ)分析顯示, Tomcat使用的ConcurrentHashMaps占用了很大一部分內(nèi)存來(lái)存儲(chǔ)會(huì)話。 這些會(huì)話對(duì)象幾乎是空的,但是它們太多了,以至于它們消耗了約50%的保留Java堆空間。
向Tomcat啟動(dòng)腳本中添加參數(shù): -XX:+HeapDumpOnOutOfMemoryError以在java.lang.OutOfMemoryError: Java heap space上獲取Java堆轉(zhuǎn)儲(chǔ)
我要做的第一件事是將web.xml會(huì)話超時(shí)從默認(rèn)的30分鐘限制為1分鐘(可能的最低選擇):
那解決了問(wèn)題– GC清理了堆,結(jié)果更好,并且不再拋出OutOfMemoryError。 但是更重要的是這些會(huì)議來(lái)自何處? 答案是:Spring Security。
默認(rèn)情況下,Spring Security根據(jù)需要創(chuàng)建會(huì)話-這意味著,如果用戶已成功通過(guò)身份驗(yàn)證,則將創(chuàng)建會(huì)話。 就我而言,它意味著–總是如此。 為了防止Spring Security創(chuàng)建會(huì)話,需要將create-session='never'添加到http :
<http create-session='never'><!-- ... --> </http>您可能會(huì)認(rèn)為–空的會(huì)話對(duì)象應(yīng)該不是問(wèn)題。 我可以告訴您,對(duì)于每秒處理數(shù)百個(gè)請(qǐng)求的應(yīng)用程序來(lái)說(shuō),它確實(shí)是一個(gè)改變。 尤其是當(dāng)它不在云中運(yùn)行或只有很少的GB或RAM專用于Java堆時(shí)。 經(jīng)過(guò)這些修改后,Java堆的用法如下所示:
參考:在軟件開(kāi)發(fā)之旅博客上,我們的JCG合作伙伴 Maciej Walkowiak 解決了REST + Spring Security會(huì)話問(wèn)題 。
翻譯自: https://www.javacodegeeks.com/2012/07/rest-spring-security-session-problem.html
總結(jié)
以上是生活随笔為你收集整理的REST + Spring Security会话问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ddos攻击(ddos书)
- 下一篇: JSF – PrimeFaces和休眠集