我正在編寫一個過濾器來執行日誌記錄,如果請求最終會在某個servlet中結束,我需要禁用此日誌記錄。servlet過濾器是否有可能計算出哪個servlet將處理請求
有什麼辦法讓過濾器知道哪個servlet將處理請求?
我正在編寫一個過濾器來執行日誌記錄,如果請求最終會在某個servlet中結束,我需要禁用此日誌記錄。servlet過濾器是否有可能計算出哪個servlet將處理請求
有什麼辦法讓過濾器知道哪個servlet將處理請求?
您可能希望設置servlet過濾器映射,以便在完全請求特定的servlet時不會觸發它。
示例配置可能看起來像這樣,假設有一個DefaultServlet不應受過濾器和其他兩個受影響的servlet FirstServlet和SecondServlet的影響。
<filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>FirstServlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<servlet-name>SecondServlet</servlet-name>
</filter-mapping>
可以分配這些要被過濾 例如網址模式
<filter>
<filter-name>Admin</filter-name>
<filter-class>com.nil.FilterDemo.AdminFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Admin</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
此過濾器將針對servlet引擎使用/ admin映射處理的每個請求運行。
他想做相反的事。 – BalusC 2011-04-04 13:31:24
我一直認爲你應該能夠在web.xml中例如url-patterns。如果你可以這樣做:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>
<match>/resources/*</match>
<except>/resouces/images/blah.jpg</except>
</url-pattern>
但你不能這樣對你沒有幫助!
你顯然必須通過請求對象訪問URL的過濾器,所以你可以做這樣的事情:
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)sRequest;
if(!request.getRequestURI.equals("/resources/images/blah.jpg")) {
doLogging();
}
chain.doFilter();
}
(這裏硬編碼的,但你很可能從屬性文件中讀取)儘管這可能對您沒有用處,因爲您在查詢中提到了servlet,而不是URL模式。
編輯:另一種想法。如果你不介意做你的記錄在servlet完成後,你可以做這樣的事情:
public void doFilter(ServletRequest sRequest, ServletResponse sResponse,
FilterChain chain) throws IOException, ServletException {
sRequest.setAttribute("DO_LOGGING", new Boolean(true));
chain.doFilter();
Boolean doLogging = (Boolean)sRequest.getAttribute("DO_LOGGING");
if(doLogging) {
doLogging();
}
}
,並要伐木排除可以只該屬性設置爲false,你的servlet。
public void doGet(HttpServletRequest req,
HttpServletResponse res) throws IOException {
req.setAttribute("DO_LOGGING", new Boolean(false));
// other stuff
}
不幸的是,我想忽略的servlet是默認的servlet,它處理所有未在別處處理的URL。這意味着它會有一個非常複雜的URL模式。 – tomdee 2011-04-04 10:03:39
您可以將過濾器不僅映射到URL模式,而且還映射到特定的servlet。這意味着您可以僅爲您希望應用過濾器的servlet定義映射。 – 2011-04-04 10:06:19