通過我知道下面的一切手段是不可能的,但它在我們的生產環境中的其中之一發生:ThreadLocal共享數據?
SETUP
- ESAPI 2.01
主要的Servlet過濾器的設置和刪除當前請求線程本地對象:
try { ESAPI.httpUtilities().setCurrentHTTP(request, response); // filter logic ... } catch (Exception e) { LOG.error(Logger.SECURITY_FAILURE, "Error in ESAPI " + "security filter: " + e.getMessage(), e); request.setAttribute("message", e.getMessage()); } finally { ESAPI.clearCurrent(); }
所有請求都通過此過濾器,並且在整個系統中使用ESAPI.currentRequest()
。
- 路徑A(
http://server/path_a/
)- 經過,直到它到達
method_a
,這種方法是不是從path_b
- 經過,直到它到達
- 路徑B(
http://server/path_b
)- 訪問經過,直到其達到
method_b
,無法從path_a
訪問
- 訪問經過,直到其達到
這些路徑都經過Servlet過濾器(映射「/*
」)
一,我收到了我們的錯誤郵件的提示path_a
拋出一個錯誤,這又引發了錯誤郵件,在郵件代碼中,爲請求信息枚舉當前請求(通過ESAPI.currentRequest()
)。
問題
在錯誤的郵件,要求從path_a
信息與method_b
堆棧跟蹤信息相關,對我來說這似乎是不可能的,因爲在單獨的線程都運行。
問題
這怎麼可能?我不能在本地重新創建,除了設置和清除ThreadLocal
之外,我們還需要採取一些預防措施嗎?這可能是與tomcat安裝有關的問題嗎?我迷路了。
PS:從所述問題代碼已經被簡化爲代碼庫是大爲例
我對過濾器並不熟悉,但從另一個角度來看它,電子郵件是如何組成的?過濾器是否爲你做這件事,或者可能會有一些代碼不是線程安全的? – Jeroen
錯誤郵件方法是從一個單例對象中調用的,在該方法中,'ESAPI.currentRequest()'用於枚舉信息 – epoch