1

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

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

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

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

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

4

2 回答 2

1

一个足够简单的方法是在你的 Servlet 中设置一个请求属性,并在过滤器中返回时检查它。

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
    }

}

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

显然,使用此用例独有的属性键。

于 2013-08-16T15:00:22.527 回答
0

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

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

web.xml

将元素包含<dispatcher><filter-mapping>.

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

过滤器注册

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

final FilterRegistration registration = servletContext.addFilter(...);
registration.addMappingForUrlPatterns(
    EnumSet.of(DispatcherType.INCLUDE), true, "/*");
于 2015-04-22T17:59:50.440 回答