servlets - Servlet 过滤器 : is there `doFilter(HttpServletRequest)`

标签 servlets jakarta-ee servlet-filters

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

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

最佳答案

你并不是唯一一个多年来一直希望如此的人。这实际上没有合理的理由。因此,即将推出的 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)

如果 session 尚未创建,则其为null

关于你的第二个问题,

How should I pass the ServletRequest to the HttpServletRequestWrapper? 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/

相关文章:

java - 不使用 Spring 发送 HTML 模板电子邮件

java - 如何将图像流式传输到 Amazon S3

jsp - 我如何指定我希望我的 jsp-config 指令应用于我们的应用程序中提供的所有 JSP 页面?

java - 如何获取ConstraintValidatorContext?

java - 我得到一个 PersistenceException,我不明白为什么

java - 如何为一个特定的 servlet 应用过滤器?

java - Android游戏分数int通过servlet添加到access数据库中

java - JPA @version - 可以用来计算表条目的版本

java - Http Servlet 请求在读取一次后会丢失 POST 正文中的参数

java - Spring-Boot:用于重定向的 Web 过滤器