我认为这就是问题所在:-
首先,您需要使用 RequestFilter 而不是 ResponseFilter。
com.sun.jersey.spi.container.ContainerResponseFilter 是 jersey 1.x 过滤器。
API link here.
最新版球衣使用javax.ws.rs.container.ContainerResponseFilter。 API link here
看起来你的类路径中有 jersey 1.x 和 2.x jar。您需要使用您需要的一个并删除另一个。
假设您使用的是最新的 2.x jar
您需要实现自己的 RequestFilter,如下所示:-
@Provider
public class YourReqeustFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
// Use ContainerRequestContext to intercept the http request.
}
}
}
那么你的 servlet 的 web.xml 应该如下所示:-
<servlet>
<servlet-name>MY API</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.container.ContainerRequestFilter</param-name>
<param-value>yourReqeustFilter</param-value>
</init-param>
<init-param>
<param-name>javax.ws.rs.container.ContainerResponseFilterr</param-name>
<param-value>yourResponseFilter</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
但是请注意,当您的网页通过 web.xml 中的声明式安全性受到保护并且上面有过滤器时;您的过滤器将无法保留页面上被阻止的 HTTP 请求;由于请求首先进入您的容器并且容器由于声明性安全性而保护它,然后请求最终到达您的过滤器。简而言之,容器优先于您的过滤器。
在这种情况下,尽管您可以将相关页面从声明性安全性中分离出来,并在过滤器中以编程方式处理安全性部分。
例如,在上面的 filter 方法中,您可以使用 :-
requestContext.getSecurityContext() 获取对 SecurityContext 的保留,并访问提供安全访问权限的方法。
程序化安全的开始here.