【问题标题】:Servlet filters: is there `doFilter(HttpServletRequest)`Servlet 过滤器:是否有`doFilter(HttpServletRequest)`
【发布时间】:2017-05-14 00:33:22
【问题描述】:

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

  • 为什么?由于 HTTP 是所有 Web 组件通用的唯一方法,那么拥有一个特定于 HTTP 的过滤器是否有意义,就像 servlet 一样?理由是什么?
  • 我应该如何将ServletRequest 传递给HttpServletRequestWrapper?我必须手动向下转换,还是有更合适的方法?

【问题讨论】:

标签: servlets jakarta-ee servlet-filters


【解决方案1】:

多年来,你并不是唯一一个希望这样做的人。这实际上没有合理的理由。因此,即将推出的 Servlet 4.0(Java EE 8 的一部分)将根据spec issue 141 最终提供javax.servlet.http.HttpFilter。它目前已经是implemented 中的Tomcat 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(如果尚未创建)。

关于你的第二个问题,

我应该如何将ServletRequest 传递给HttpServletRequestWrapper?是否必须手动向下转换,还是有更合适的方法?

看看existing code snippets这里的几个真实世界的例子。

【讨论】:

    猜你喜欢
    • 2018-01-31
    • 2012-10-07
    • 2010-10-15
    • 2014-02-14
    • 2014-11-14
    • 2015-09-12
    • 2012-07-19
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多