我正在编写一个执行日志记录的过滤器,如果请求最终会在某个servlet上结束,我需要禁用此日志记录。
过滤器有没有办法知道哪个servlet会处理请求?
答案 0 :(得分:6)
您可能希望设置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>
答案 1 :(得分:0)
您可以指定要过滤的网址格式 例如
<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映射处理的每个请求运行。
答案 2 :(得分:0)
我一直认为您应该能够在web.xml中对url-patterns进行例外处理,例如如果你能做这样的事情:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>
<match>/resources/*</match>
<except>/resouces/images/blah.jpg</except>
</url-pattern>
但你不能这样对你没有帮助!
您显然可以通过请求对象访问Filter中的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();
}
}
并且要从日志记录中排除的servlet只能将该属性设置为false。
public void doGet(HttpServletRequest req,
HttpServletResponse res) throws IOException {
req.setAttribute("DO_LOGGING", new Boolean(false));
// other stuff
}