Servlet过滤器和Jersey过滤器有什么区别?

Dof*_*ngo 1 servlets jersey servlet-filters jersey-2.0

我阅读了很多教程,但我不明白Servlet过滤器和Jersey过滤器之间的区别是什么。有人可以示范我吗?

Pau*_*tha 7

在Servlet容器中,您有Servlet和Servlet过滤器。通常,Servlet处理请求的处理,而Servlet Filter处理请求的后处理。所以请求流看起来像

Request --> Filter --> Servlet --> Filter --> Response
Run Code Online (Sandbox Code Playgroud)

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

Request --> Filter --> Jersey-Servlet --> Filter --> Response
Run Code Online (Sandbox Code Playgroud)

泽西岛也有自己的过滤器,即ContainerRequestFilterContainerResponseFilter。仅在Jersey应用程序的上下文中,它们的作用与Servlet筛选器相同。它们用于预处理和后处理。以下流程仅在Jersey请求中。

Request --> ContainerRequestFilter --> Resource --> ContainerResponseFilter -> Response
Run Code Online (Sandbox Code Playgroud)

因此,这些过滤器在请求的预处理和后处理中具有相同的目的。主要区别在于它们的连接级别。Servlet过滤器在servlet级别绑定,而Jersey过滤器在Jersey级别绑定。

那么您应该使用哪一个呢?

好吧,这取决于您何时调用它以及需要访问哪些信息。以安全为例。考虑保护应用程序安全时,您可能希望安全门尽可能远离数据。因此,您可以使用Servlet过滤器实现安全性。但是,您需要只能在Jersey应用程序中获取的信息,那么您将需要使用Jersey过滤器。例如,您需要知道调用哪个资源方法。您只能从ResourceInfoJersey过滤器内部获取此信息

Request --> Filter --> Servlet --> Filter --> Response
Run Code Online (Sandbox Code Playgroud)

您无法在Servlet过滤器中执行上述操作。此信息仅可从Jersey应用程序的上下文访问。也许您可能想在Servlet过滤器中处理身份验证,然后在身份验证之后将结果存储在HttpServletRequest属性中。然后在授权中,您可以在Jersey级别进行处理,如上所示。您可以将HttpServletRequest注入Jersey过滤器中,并从那里获取属性。

这只是一个例子。有很多用例。您只需决定要实现哪种过滤器类型,哪种才是最适合您的应用程序的。在大多数情况下,您可以使用Jersey过滤器,但是有时您需要尽可能早地在请求中调用过滤器,在这种情况下,您可能希望使用服务器过滤器。在其他情况下,您需要访问只能在Jersey应用程序中获取的信息。为此,您应该使用Jersey过滤器。


脚注

1.也可以将Jersey应用程序配置为作为Servlet过滤器而不是Servlet运行。我相信他们提供此选项的原因是,某些Jersey功能需要某些仅在Filter中提供的功能。