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