我目前有一个servlet,它充当所有传入的AJAX请求的中心点。让我们调用这个servlet AJAXHandler 。
AJAX请求可以捆绑在一起形成一个大请求,然后AJAXHandler servlet分隔每个请求并为每个请求调用“RequestDispatcher.include”。然后,它将每个servlet的响应捆绑成一个大的响应,并将其发送回客户端。
我还有一个用于缓存servlet响应XML的过滤器。我想知道如何指定一个servlet过滤器URL模式,该模式适用于通过AJAXDispatcher servlet接收请求的任何servlet。这可能吗?
我无法使用'/ *'模式,因为这将匹配未通过AJAXDispatcher servlet调用的servlet。
编辑 - 过滤器用于缓存响应。我需要缓存AJAXHandler转发的各个servlet的响应, NOT 最终由AJAXHandler本身返回的捆绑响应。
答案 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
是来源时进一步仅应用过滤器。
在<dispatcher>
。{/ p>中加入<filter-mapping>
个元素
<filter-mapping>
<url-pattern>/*</url-pattern>
<dispatcher>INCLUDED</dispatcher>
</filter-mapping>
FilterRegistration.addMappingForServletNames(...)
和FilterRegistration.addMappingForUrlPatterns(...)
都将EnumSet<DispatcherType>
作为第一个参数。
final FilterRegistration registration = servletContext.addFilter(...);
registration.addMappingForUrlPatterns(
EnumSet.of(DispatcherType.INCLUDE), true, "/*");