2016-12-29 51 views
1

该Servlet API限定了GenericServlet它接受ServletRequest对象,和子类它HttpServlet它接受HttpServletRequest。但是,Filter.doFilter似乎只接受ServletRequest。是否有特定于HTTP请求的过滤器类?如果不是Servlet过滤器:有`的doFilter(HttpServletRequest的)`

  • 为什么?由于HTTP是所有Web组件共有的唯一方法,因此像Servlet一样拥有HTTP特定的过滤器是否合理?基本原理是什么?
  • 我应该如何通过ServletRequestHttpServletRequestWrapper?我是否必须手动下载它,还是有更合适的方法?
+2

相关:[何时将调用javax.servlet.Filter.doFilter(ServletRequest req,ServletResponse res)以外的任何东西而不是HttpServletRequest/Response?](http://stackoverflow.com/questions/12350053/when-would-的javax-servlet的过滤dofilterservletrequest-REQ-ServletResponse的清晰度) –

回答

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 HttpFilter(这是open source,所以你可以使用它为灵感进行烘烤你自己),这恰好具有以下特征:

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

由此sessionnull如果尚未创建它。

至于你的第二个问题,

我应该如何通过ServletRequestHttpServletRequestWrapper?我是否必须手动下载它,还是有更合适的方法?

看看existing code snippets在这里几个现实世界exapmles。