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

What is the difference between a Servlet filter and a Jersey filter?

我看了很多教程,但我不明白 Servlet 过滤器和 Jersey 过滤器之间的区别。谁能给我解释一下区别?

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

Request --> Filter --> Servlet --> Filter --> Response

Jersey 应用程序作为 Servlet1 实现。所以在上面的流程中,只需将“Servlet”替换为Jersey即可。

Request --> Filter --> Jersey-Servlet --> Filter --> Response

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

Req --> ContainerRequestFilter --> Resource --> ContainerResponseFilter --> Res

所以这些过滤器服务于相同的目的,预先和 post 处理请求。主要区别在于它们连接的级别。 Servlet 过滤器绑定在 servlet 级别,而 Jersey 过滤器绑定在 Jersey 级别。

那么你应该使用哪一个?

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

中的 ResourceInfo 获取此信息
class MyResource {
    @RolesAllowed("ADMIN")
    public Response get() {}
}

class AuthorizationFilter implements ContainerRequestFilter {
    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(ContainerRequestContext request) {
        Method method = resourceInfo.getResourceMethod();
        RolesAllowed rolesAllowed = method.getAnnotation(RolesAllowed.class);
    }
}

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

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


脚注

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