Java 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过滤器映射,以便在请求特定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定义映射。