【问题标题】:javax servlet filter vs jersey filter [duplicate]javax servlet过滤器与泽西过滤器[重复]
【发布时间】:2014-08-21 06:01:28
【问题描述】:

我正计划编写一个 servlet 应用程序(用于使用 OSGI 部署)并使用一些过滤器进行 HTTP 标头预处理。虽然最初决定使用 javax.servlet 过滤器实现,但我突然想到,我实际上不知道为什么/何时选择使用它而不是 Jersey ContainerRequestFilter。 当然后者带有一些预先构建的过滤器,但可以说前者也是如此(例如 Cors 过滤器)。 因此,在选择使用哪个 API 时应该考虑什么?是否存在不应该使用一种来支持另一种的特定情况?

【问题讨论】:

  • 这个问题和link不一样,它不问是否可能,也不问哪个最好,而是在选择时应该考虑什么。另一个问题也没有回答。

标签: java servlets jersey


【解决方案1】:

来自https://dennis-xlc.gitbooks.io/restful-java-with-jax-rs-2-0-en/cn/part1/chapter12/server_side_filters.html

[...] servlet 过滤器环绕 servlet 处理,并在同一个 Java 调用堆栈中运行。因为 JAX-RS 具有异步 API,所以 JAX-RS 过滤器不能在同一个 Java 调用堆栈中运行。在调用 JAX-RS 方法之前,每个请求过滤器都会运行完成。 [...]

我认为,这是一个关键的区别,在选择一个或另一个时应该考虑这一点。

【讨论】:

    【解决方案2】:

    JAX-RS 过滤器的问题在于您无法控制执行过滤器链

    chain.doFilter(request, response);
    

    因为我现在的问题是将 Servlet 过滤器转换为 JAX-RS 过滤器,但当前的 Servlet 过滤器调用整个过滤器链,以便最终检查响应及其状态。从我的角度来看,使用 JAX-RS 过滤器是不可能的。

    【讨论】:

    • 好的,现在我已经掌握了可以使用ContainerResponseFilter 来检查最后的过滤器链。
    • 你的意思是可以看到注册的过滤器和注册的顺序?
    【解决方案3】:

    无论您决定如何,您使用基于 javax.servlet 的过滤器实现,因为它是您在 Java EE 中使用的每个 Filter 的基本接口。

    http://docs.oracle.com/javaee/6/api/javax/servlet/Filter.html

    现在,Jersey 附带了一个添加一些功能的实现(访问您的 ContainerRequestContext 或您在 Jersey 应用程序中需要的任何内容)。您是否已在应用程序中使用 Jersey?然后去吧,如果不是我不会打扰(至少先验并且没有进一步的信息),只是去寻找javax.servlet.Filter的最简单的可能实现并将它直接放入我的web.xml

    【讨论】:

    • 谢谢。因此,显然也可以从过滤器实现(.getHeader()、.getParameter() 等)访问请求上下文,但我认为 ContainerRequestContext 通过具有各种内置 getter 等提供了更多的技巧。
    • @Jorge_B - 我没有看到 ContainerRequestFilter 扩展了 servlet Filter 接口。您能否解释一下您的意思:“无论您决定什么,您都将使用基于 javax.servlet 的过滤器实现,因为它是您在 Java EE 中使用的每个过滤器的基本接口。”。谢谢!
    • 我的立场是正确的,Jersey 实现不扩展 javax.servlet.Filter。在这种情况下,您只有对 ContainerRequestContext 的引用来与应用程序行为交互,并且无法像在普通过滤器中那样更改过滤器链。感谢您的评论!
    • 您能否详细说明@elanh 的问题,因为我也很困惑?
    猜你喜欢
    • 2014-02-10
    • 2011-08-17
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2010-12-30
    • 2012-06-04
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多