Servlets Servlet筛选器:是否存在`doFilter(HttpServletRequest)`

Servlets Servlet筛选器:是否存在`doFilter(HttpServletRequest)`,servlets,jakarta-ee,servlet-filters,Servlets,Jakarta Ee,Servlet Filters,servlet API定义了一个GenericServlet,它接受ServletRequest对象,并将其子类化为HttpServlet,它接受HttpServletRequest。但是,Filter.doFilter似乎只接受ServletRequest。是否存在特定于HTTP请求的筛选器类?如果不是 为什么??既然HTTP是所有web组件的唯一通用方法,那么像Servlet一样使用HTTP特定的过滤器是否有意义呢?理由是什么 如何将ServletRequest传递给HttpServlet

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

  • 为什么??既然HTTP是所有web组件的唯一通用方法,那么像Servlet一样使用HTTP特定的过滤器是否有意义呢?理由是什么
  • 如何将
    ServletRequest
    传递给
    HttpServletRequestWrapper
    ?我必须手动将其降级,还是有更合适的方法

    • 你不是唯一一个长久以来都希望如此的人。这实际上没有合理的理由。因此,即将发布的Servlet4.0(JavaEE8的一部分)最终将附带一个
      javax.Servlet.http.HttpFilter
      。它目前已经在运行中。方法签名为:

      protected void doFilter(HttpServletRequest request,
                              HttpServletResponse response,
                              FilterChain chain)
      
      在此之前,您最好自己烘焙一个
      HttpFilter
      ,或者如果您碰巧使用了基于JSF+CDI的web应用程序,则可以使用grab(也就是说,您可以将其作为自己烘焙的灵感),它恰好具有以下特征:

      public void doFilter(HttpServletRequest request,
                           HttpServletResponse response,
                           HttpSession session,
                           FilterChain chain)
      
      如果尚未创建,
      会话
      则为
      null

      至于你的第二个问题

      如何将
      ServletRequest
      传递给
      HttpServletRequestWrapper
      ?我必须手动将其降级,还是有更合适的方法

      只需在这里查看几个真实世界的示例。

      相关: