Servlet过滤器:是否有`doFilter(HttpServletRequest)`

时间:2016-12-29 16:47:32

标签: servlets java-ee servlet-filters

servlet API定义GenericServlet接受ServletRequest个对象,并将其子类化为接受HttpServlet的{​​{1}}。但是,HttpServletRequest似乎只接受Filter.doFilter。是否存在特定于HTTP请求的过滤器类?如果不是

  • 为什么?由于HTTP是所有Web组件共有的唯一方法,因此拥有特定于HTTP的过滤器是不合理的,就像servlet一样?理由是什么?
  • 我应该如何将ServletRequest传递给ServletRequest?我是否需要手动转发它,还是有更合适的方式?

1 个答案:

答案 0 :(得分:2)

你并不是唯一一个愿意这么久的人。实际上没有合理的理由。因此,即将到来的Servlet 4.0(Java EE 8的一部分)将根据spec issue 141最终得到javax.servlet.http.HttpFilter。它目前已在implementedTomcat 9。方法签名是:

protected void doFilter(HttpServletRequest request,
                        HttpServletResponse response,
                        FilterChain chain)

在此之前,您最好的选择是亲自HttpFilter,或者如果您碰巧使用基于JSF + CDI的Web应用程序,请抓住OmniFaces HttpFilteropen source,这样您就可以了可以使用它作为自己烘焙的灵感),恰好有以下签名:

public void doFilter(HttpServletRequest request,
                     HttpServletResponse response,
                     HttpSession session,
                     FilterChain chain)

如果session尚未创建,nullServletRequest

关于你的第二个问题,

  

我应该如何将HttpServletRequestWrapper传递给extension Array { func fun (_ iterator: (Int, Element) -> Void) -> Void { for (key,value) in self.enumerated() { iterator(key,value) } } } ?我是否必须手动转发它,还是有更合适的方式?

在这里查看existing code snippets几个真实世界的问题。