我正在编写一个过滤器来执行日志记录,如果请求最终会在某个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