我正在尝试使用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>
答案 0 :(得分:34)
好的,我没有得到jersey.config.server.provider.packages
init param不仅需要引用服务类(API端点),还需要引用包括过滤器在内的所有类。
现在可行:
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.hck.debate.rest.controller;com.hck.debate.rest.security</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerRequestFilters</param-name>
<param-value>com.hck.debate.rest.security.AuthFilter</param-value>
</init-param>
答案 1 :(得分:23)
我还必须将 @Provider JAX-RS注释添加到我的过滤器中。
这使得在JAX-RS扫描阶段可以发现滤波器。
@Provider
public class MyAppFilter implements ContainerRequestFilter {
// filter logic
}
答案 2 :(得分:5)
一些提示:
确保您在过滤器中使用正确的导入:
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;
添加@Provider
注释
答案 3 :(得分:2)
使用球衣工作过滤器的最低要求:
不需要任何其他设置(例如'com.sun.jersey.spi.container.ContainerRequestFilters'init-param或ResourceConfig)
答案 4 :(得分:2)
我对JAX-RS 2,jersey有相同的问题,并且下面的注释修复了它
@PreMatching
答案 5 :(得分:1)
我们在ResourceConfig实现类中缺少以下调用:
register(CorrelationIdFilter.class);
答案 6 :(得分:0)
您可以使用@Provider
手动注册ContainerRequestFilter
,而不是使用JerseyServletFactory
注释(在我的情况下不起作用):
JerseyServletFactory jerseyServletFactory = new JerseyServletFactory(config);
HttpServlet myServiceServlet = jerseyServletFactory.create(myResource);
// Register your ContainerRequestFilter like this
jerseyServletFactory.addRequestFilter(new MyFilter());
httpServer.register(myServiceServlet, "/api");
httpServer.start();
答案 7 :(得分:0)
而不是javax.ws.rs,我使用com.sun.jersey并且它起作用了
import com.sun.jersey.spi.container.ContainerRequestFilter
import com.sun.jersey.spi.container.ContainerRequest
Dropwizard用户需要这样做
environment.jersey().getResourceConfig()
.getContainerRequestFilters()
.add(filter);
答案 8 :(得分:0)
如果你像我一样被困,请注意TomEE 1.7.X使用的是JAX-RS 1.1,它不包含ContainerRequestFilter。
答案 9 :(得分:0)
对于在MULE ESB中遇到此问题的任何人。 请记住注册路径:
<jersey:resources doc:name="REST">
<component doc:name="rest component">
<spring-object bean="endpoit"/>
</component>
<jersey:package packageName="path @Provider-s"/>
</jersey:resources >