【问题标题】: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)
其中session 是null(如果尚未创建)。
关于你的第二个问题,
我应该如何将ServletRequest 传递给HttpServletRequestWrapper?是否必须手动向下转换,还是有更合适的方法?
看看existing code snippets这里的几个真实世界的例子。