我阅读了很多教程,但是我不明白Servlet过滤器和Jersey过滤器之间的区别是什么。有人可以示范我吗?
答案 0 :(得分:6)
在Servlet容器中,您有Servlet和Servlet过滤器。通常,Servlet处理请求的处理,服务器过滤器处理请求的后处理。所以请求流看起来像
Request --> Filter --> Servlet --> Filter --> Response
Jersey应用程序,它实现为Servlet。因此,在上述流程中,只需将“ Servlet”替换为Jersey。
Request --> Filter --> Jersey-Servlet --> Filter --> Response
Jersey还具有自己的过滤器,即ContainerRequestFilter
和ContainerResponseFilter
。仅在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过滤器。