java內部重定向死循環檢測詳解【附源碼】

      最近聽到一個消息,據說騰訊的財付通在招聘 Java 方面的高手,"參與系統架構選型",要把底層架構從 C/C++ 遷移到 Java 架構上來。其實當你的項目到一定規模之後更多需要考慮的是多人協作開發的問題,可能當初財付通的核心代碼也就是一兩個人用C/C++搞定的,可是當業務擴大、複雜之後,發現多人C/C++來並行發開變的不是那麼靠譜。於是乎java這種近乎工業標準的東西出來了。。。有點扯遠了。引出我們今天的話題,java多人並行開發是很出色,但是只要是並行的那麼就會存在一些問題。

      比如:A程序員在A頁面寫了以個邏輯,當邏輯判斷滿足就內部重定向到B程序員寫的B頁面,但是剛好B程序員在B頁面中的邏輯是滿足某些條件就跳轉到A頁面,於是乎當某些特定條件下,兩個頁面就在不停的重定向一直到jvm的溢出。

      平時我們遇到這種問題可能找一會就找到了,也基本上沒有什麼影響。但是在一個成熟的業務系統中遇到這樣的問題就是致命的。可能會導致服務器掛掉。。或者整個集羣的連鎖反應(集體掛掉)。當然你的用戶也就訪問不到你的站點了,在工業標準中我們考慮更多的就是怎麼讓系統更穩定。比如:淘寶一天都宕機了,該有多少商家要發瘋。

      再次進入正題,如何來解決這種問題保證系統的絕對穩定呢?很簡單一個fielter就搞定了

 

上面這個fielter會檢測請求的原始來源地址,然後判斷與當前需要跳轉的地址是否一致,如果一致那麼肯定會形成以個環路,於是jvm就在不停執行跳轉一直到堆棧溢出。

對fielter進行了改進,用一個list來記錄了forward的跳轉路徑,方便在頁面顯示出形成環路的過程

 

 

當我們檢測到這種環路,我們就可以拋出異常,定義統一的錯誤頁面。。。。等等來友好的解決之。。。

 

如下fielter的配置就可以看到,我們過濾了所有forward跳轉的請求

 

如果有其他需求,類似的配置就OK了

 

萬惡的csdn不能傳圖片啊。。。。

只好上文字了,如果出現環,就會在頁面顯示,可以下個例子自己看效果

has circle,the cytle is : [/fielter/index.htm, /fielter/test2.htm, /fielter/test.htm, /fielter/test2.htm]

 

接下來附帶一個maven搭的測試列子,直接mvn jetty:run,然後再瀏覽器中http://localhost:8080/fielter/index.htm  就可以看到攔截的效果了

 

源碼:點此下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章