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

时间:2018-09-06 14:48:40

标签: servlets jersey jersey-2.0 servlet-filters

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

Jersey还具有自己的过滤器,即ContainerRequestFilterContainerResponseFilter。仅在Jersey应用程序的上下文中,它们的作用与Servlet筛选器相同。它们用于预处理和后处理。

Request --> ContainerRequestFilter --> Resource --> ContainerResponseFilter -> Response

因此,这些过滤器在请求的预处理和后处理中具有相同的目的。主要区别在于它们的连接级别。 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过滤器中处理 authentication ,然后在身份验证之后将结果存储在HttpServletRequest属性中。然后,在授权中,您可以在Jersey级别进行处理,如上所示。您可以将HttpServletRequest注入Jersey过滤器中,并从那里获取属性。

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