javax servlet过滤器与泽西过滤器

时间:2014-06-30 19:17:49

标签: java servlets jersey

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

4 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

chain.doFilter(request, response);

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

答案 2 :(得分:0)

来自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方法之前,每个请求过滤器都会运行完成。 [...]

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

答案 3 :(得分:0)

在Servlet容器中,您有Servlet和Servlet过滤器。通常,Servlet处理请求的处理,而Server Filter处理请求的处理。

所以请求流看起来像

请求->过滤器-> Servlet->过滤器->响应

Jersey应用程序,它实现为Servlet。因此,在上述流程中,只需将“ Servlet”替换为Jersey。

请求->过滤器-> Jersey-Servlet->过滤器->响应

Jersey还拥有自己的过滤器,即ContainerRequestFilter和ContainerResponseFilter。

仅在Jersey应用程序的上下文中,它们具有与Servlet筛选器相同的目的。它们用于预处理和后处理。

请求-> ContainerRequestFilter->资源-> ContainerResponseFilter->响应

因此,这些过滤器在请求的处理之前和之后都具有相同的目的。

主要区别在于它们的连接级别

Servlet过滤器在servlet级别绑定,而Jersey过滤器在Jersey级别绑定。

那您应该使用哪一个?

这取决于何时调用以及需要访问哪些信息

例如

a。以安全为例。考虑保护应用程序安全时,您可能希望安全门尽可能远离数据。因此,您可以使用Servlet过滤器实现安全性。但是,您需要只能在Jersey应用程序内部获得的信息(假设您在方法级别定义了一些注释),那么您将需要使用Jersey过滤器。例如,您需要知道调用哪个资源方法。您只能从Jersey过滤器内的ResourceInfo获取此信息

source