Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaxservlet过滤器与jersey过滤器_Java_Servlets_Jersey - Fatal编程技术网

javaxservlet过滤器与jersey过滤器

javaxservlet过滤器与jersey过滤器,java,servlets,jersey,Java,Servlets,Jersey,我计划编写一个servlet应用程序(用于OSGI部署),并使用一些过滤器进行HTTP头预处理。虽然最初决定使用javax.servlet过滤器实现,但我突然想到,我实际上不知道为什么/何时会选择使用该过滤器而不是Jersey ContainerRequestFilter。 虽然后者附带了一些预构建的过滤器,但可以说前者(如Cors过滤器)也是如此。 因此,在选择使用哪种API时应该考虑什么?是否存在不应使用其中一个而使用另一个的特定情况?无论您决定什么,您都将使用基于javax.servlet

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

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


现在,Jersey附带了一个实现,它添加了一些功能(访问
ContainerRequestContext
或Jersey应用程序中需要的任何内容)。您是否已在应用程序中使用Jersey?如果不是的话,那就去做吧,我不想费心(至少是先验的,没有更多的信息),只需要去做
javax.servlet.Filter
的最简单的实现,并将它直接放到我的web.xml

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

chain.doFilter(request, response);
因为我现在的问题是将Servlet过滤器转换为JAX-RS过滤器,但是当前的Servlet过滤器调用整个过滤器链,以便最终检查响应及其状态。在我看来,使用JAX-RS过滤器是不可能做到这一点的

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


我认为,这是一个关键的区别,在选择一个或另一个时应该考虑。这个问题是不一样的,因为它不问它是可能的,也不是最好的,而是当选择时应该考虑什么。另一个问题也没有回答。谢谢。因此,从过滤器实现(.getHeader(),.getParameter()等)访问请求上下文显然也是可能的,但我认为ContainerRequestContext通过使用各种内置的getter等提供了更精细的访问方法。@Jorge_B-我看不到ContainerRequestFilter扩展了servlet过滤器接口。您能解释一下您的意思吗:“无论您决定什么,您都将使用基于javax.servlet的过滤器实现,因为它是您在JavaEE中使用的每个过滤器的基本接口。”。谢谢我需要更正,Jersey实现没有扩展javax.servlet.Filter。在这种情况下,您只有对ContainerRequestContext的引用来与应用程序行为交互,并且无法像在普通筛选器中那样更改筛选器链。谢谢你的评论!你能详细解释一下@elah问题吗,因为我也很困惑?好吧,现在我已经掌握了ContainerResponseFilter可以用来检查最后的过滤器链。你的意思是说你可以看到过滤器注册以及它们注册的顺序吗?