我阅读了很多教程,但我不明白 Servlet 过滤器和 Jersey 过滤器之间有什么区别。谁能向我解释这些差异?
最佳答案
在 Servlet 容器中,有 Servlet 和 Servlet 过滤器。通常,Servlet 处理请求,而 Servlet Filter 处理请求的 pre an post 处理。所以请求流看起来像
Request --> Filter --> Servlet --> Filter --> Response
Jersey 应用程序实现为 Servlet1。因此,在上述流程中,只需将“Servlet”替换为 Jersey。Request --> Filter --> Jersey-Servlet --> Filter --> Response
Jersey 也有自己的过滤器,即 ContainerRequestFilter
和 ContainerResponseFilter
.它们的用途与 Servlet 过滤器相同,只是在 Jersey 应用程序的上下文中;它们用于预处理和后处理。以下流程在 Jersey 请求中。Req --> ContainerRequestFilter --> Resource --> ContainerResponseFilter --> Res
因此,这些过滤器具有相同的目的,即请求的预处理和后处理。主要区别在于它们连接的级别。 Servlet 过滤器绑定(bind)在 servlet 级别,而 Jersey 过滤器绑定(bind)在 Jersey 级别。那么你应该使用哪一个呢?
好吧,这取决于您希望何时调用它以及您需要访问哪些信息。以安全为例。在考虑保护您的应用程序时,您可能希望您的安全门尽可能远离数据。因此,您可以使用 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 级别处理它,如上所示。您可以注入(inject) HttpServletRequest
进入 Jersey 过滤器,并从那里获取属性。这只是一个例子。有很多用例。您只需要确定最适合您的应用程序的过滤器类型即可。大多数情况下,您可以使用 Jersey 过滤器,但有时您需要在请求中尽早调用过滤器,在这种情况下,您可能需要使用 Servlet 过滤器。在其他情况下,您需要访问只能在 Jersey 应用程序中获得的信息。为此,您应该使用 Jersey 过滤器。
脚注
1. Jersey 应用程序也可以配置为作为 Servlet 过滤器而不是 Servlet 运行。我相信他们之所以提供此选项,是因为某些 Jersey 功能需要一些仅存在于过滤器中的功能。
关于servlets - Servlet 过滤器和 Jersey 过滤器有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52206792/