Java servlet过滤器是否可以确定哪个servlet将处理请求
我正在编写一个执行日志记录的过滤器,如果请求将在某个servlet上结束,我需要禁用此日志记录Java servlet过滤器是否可以确定哪个servlet将处理请求,java,tomcat,servlets,servlet-filters,Java,Tomcat,Servlets,Servlet Filters,我正在编写一个执行日志记录的过滤器,如果请求将在某个servlet上结束,我需要禁用此日志记录 过滤器是否有办法知道哪个servlet将处理该请求?您可能希望设置servlet过滤器映射,以便在请求特定servlet时不触发该映射 假设有一个DefaultServlet不应该受到过滤器的影响,而另外两个Servlet FirstServlet和SecondServlet必须受到影响,那么示例配置可能是这样的 <filter-mapping> <filter-name&g
过滤器是否有办法知道哪个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>
我的过滤器
第一个servlet
我的过滤器
第二个servlet
您可以指定要筛选的url模式
e、 g
管理
com.nil.FilterDemo.AdminFilter
管理
/管理员/*
此筛选器将针对servlet引擎通过/admin映射处理的每个请求运行。我始终认为您应该能够对web.xml中的url模式进行例外处理,例如,如果您可以执行以下操作:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>
<match>/resources/*</match>
<except>/resouces/images/blah.jpg</except>
</url-pattern>
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();
}
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,而不是URL模式
编辑:另一个想法。如果您不介意在servlet完成后进行日志记录,您可以这样做:
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>
<match>/resources/*</match>
<except>/resouces/images/blah.jpg</except>
</url-pattern>
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();
}
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
}
不幸的是,我想忽略的servlet是默认的servlet,它处理其他地方未处理的所有URL。这意味着它将有一个非常复杂的URL模式,您不仅可以将过滤器映射到URL模式,还可以映射到特定的servlet。这意味着您只能为要应用筛选器的servlet定义映射。