Servlet过滤器URL模式 - 如何匹配特定Servlet调度请求的所有Servlet

时间:2013-08-16 14:57:39

标签: java servlets servlet-filters

我目前有一个servlet,它充当所有传入的AJAX请求的中心点。让我们调用这个servlet AJAXHandler

AJAX请求可以捆绑在一起形成一个大请求,然后AJAXHandler servlet分隔每个请求并为每个请求调用“RequestDispatcher.include”。然后,它将每个servlet的响应捆绑成一个大的响应,并将其发送回客户端。

我还有一个用于缓存servlet响应XML的过滤器。我想知道如何指定一个servlet过滤器URL模式,该模式适用于通过AJAXDispatcher servlet接收请求的任何servlet。这可能吗?

我无法使用'/ *'模式,因为这将匹配未通过AJAXDispatcher servlet调用的servlet。

编辑 - 过滤器用于缓存响应。我需要缓存AJAXHandler转发的各个servlet的响应, NOT 最终由AJAXHandler本身返回的捆绑响应。

2 个答案:

答案 0 :(得分:1)

一个简单的方法是在Servlet中设置一个request属性,并在Filter中返回时检查它。

public class AjaxHandler extends HttpServlet {
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
        req.setAttribute("cache", "true");
        ...
    }
}

Filter

@Override
public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
    chain.doFilter(request, response)
    if (request.getAttribute("cache") != null) {
        // do your thing
    }

}

您的过滤器可以映射到所有/*

显然,请使用此用例唯一的属性键。

答案 1 :(得分:0)

过滤器只能用于匹配已通过RequestDispatcher转发或包含的请求。这对应于DispatcherType枚举和ServletRequest.getDispatcherType()。默认情况下,过滤器仅匹配REQUEST,这是从客户端将原始请求用于应用程序的调度程序类型。

进入过滤器后,您可以使用各种RequestDispatcher.INCLUDE_*属性来检索有关包含servlet的信息。这应该允许您在AJAXHandler是来源时进一步仅应用过滤器。

的web.xml

<dispatcher>。{/ p>中加入<filter-mapping>个元素

<filter-mapping>
    <url-pattern>/*</url-pattern>
    <dispatcher>INCLUDED</dispatcher>
</filter-mapping>

FilterRegistration

FilterRegistration.addMappingForServletNames(...)FilterRegistration.addMappingForUrlPatterns(...)都将EnumSet<DispatcherType>作为第一个参数。

final FilterRegistration registration = servletContext.addFilter(...);
registration.addMappingForUrlPatterns(
    EnumSet.of(DispatcherType.INCLUDE), true, "/*");