servlet过滤器是否可以确定哪个servlet将处理请求

时间:2011-04-04 09:59:27

标签: java tomcat servlets servlet-filters

我正在编写一个执行日志记录的过滤器,如果请求最终会在某个servlet上结束,我需要禁用此日志记录。

过滤器有没有办法知道哪个servlet会处理请求?

3 个答案:

答案 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
}