我正在尝试使用 ContainerRequestFilter
在基于Tomcat的Jersey应用程序上强制执行某些身份验证 . 我跟着this document . 问题:永远不会触发过滤器
过滤类:
@Provider
public class AuthFilter implements ContainerRequestFilter {
@Override
public void filter(ContainerRequestContext requestContext)
throws IOException {
// MY AUTHENTICATION CODE GOES HERE
}
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="debate-rest"
version="3.0">
<display-name>rest</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.hck.debate.rest.controller</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
10 回答
使用平针织物过滤器的最低要求:
添加@Provider注释以过滤类
过滤器类的名称空间必须包含在'jersey.config.server.provider.packages' init-param中
不需要任何其他设置(例如'com.sun.jersey.spi.container.ContainerRequestFilters'init-param或ResourceConfig)
我有同样的问题,JAX-RS 2,泽西和下面的注释修复它
我们在ResourceConfig实现类中缺少以下调用:
好吧,我没有得到
jersey.config.server.provider.packages
init参数不仅需要引用服务类(API endpoints ),还需要引用包括过滤器在内的所有类 .它现在有效:
我还必须将 @Provider JAX-RS注释添加到我的过滤器中 .
这使得在JAX-RS扫描阶段可以发现滤波器 .
一些提示:
确保您使用的是JAX-RS 2.17版 .
确保您在过滤器中使用了正确的导入:
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
添加
@Provider
注释您可以使用
JerseyServletFactory
手动注册ContainerRequestFilter
,而不是使用@Provider
注释(在我的情况下不起作用):而不是javax.ws.rs,我使用com.sun.jersey,它工作
import com.sun.jersey.spi.container.ContainerRequestFilter import com.sun.jersey.spi.container.ContainerRequest
Dropwizard用户需要这样做
如果你像我一样被困,请注意TomEE 1.7.X使用JAX-RS 1.1,它不包含ContainerRequestFilter .
对于在MULE ESB中遇到此问题的任何人 . 记得注册路径: