Jersey ContainerRequestFilter未触发

时间:2013-06-25 14:34:42

标签: jersey jersey-2.0

我正在尝试使用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 个答案:

答案 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)

一些提示:

  1. 确保您使用的是JAX-RS 2.17版。
  2. 确保您在过滤器中使用正确的导入:

    • import javax.ws.rs.container.ContainerRequestContext;
    • import javax.ws.rs.container.ContainerRequestFilter;
  3. 添加@Provider注释

答案 3 :(得分:2)

使用球衣工作过滤器的最低要求:

  • 将@Provider注释添加到过滤器类
  • 过滤器类的名称空间必须包含在'jersey.config.server.provider.packages'init-param

不需要任何其他设置(例如'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 >