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

问题描述 投票:0回答:1

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

servlets jersey jersey-2.0 servlet-filters
1个回答
6
投票

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

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

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

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

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

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

因此,这些过滤器用于处理请求的前后处理。主要区别在于它们的连接水平。 Servlet过滤器在servlet级别绑定,而Jersey过滤器在Jersey级别绑定。

So which one should you use?

那么它取决于您何时需要它以及您需要访问哪些信息。以安全为例。在考虑保护应用程序时,您可能希望安全门尽可能远离数据。因此,您可以使用Servlet过滤器实现安全性。但是您需要只能在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过滤器中处理身份验证,并在身份验证之后将结果存储在HttpServletRequest属性中。然后在授权中,您可以在Jersey级别处理它,如上所示。您可以将HttpServletRequest注入Jersey过滤器,并从中获取属性。

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

© www.soinside.com 2019 - 2024. All rights reserved.