servlet API 定义了一个接受 ServletRequest
对象的 GenericServlet
,并将其子类化为接受 HttpServletRequest
的 HttpServlet
。但是,Filter.doFilter
似乎只接受ServletRequest
。是否有特定于 HTTP 请求的过滤器类?如果没有
- 为什么?由于 HTTP 是所有 Web 组件唯一通用的方法,因此拥有一个特定于 HTTP 的过滤器(就像 servlet 一样)不是很有意义吗?理由是什么?
- 我应该如何将
ServletRequest
传递给HttpServletRequestWrapper
?我是否必须手动向下转换它,或者有更合适的方法吗?
最佳答案
你并不是唯一一个多年来一直希望如此的人。这实际上没有合理的理由。因此,即将推出的 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
。
关于你的第二个问题,
How should I pass the
ServletRequest
to theHttpServletRequestWrapper
? Do I have to downcast it manually, or is there a more appropriate way?
看看existing code snippets这里有几个现实世界的例子。
关于servlets - Servlet 过滤器 : is there `doFilter(HttpServletRequest)` ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41383842/