首页 文章

Jersey ContainerRequestFilter未触发

提问于
浏览
36

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

  • 2

    使用平针织物过滤器的最低要求:

    • 添加@Provider注释以过滤类

    • 过滤器类的名称空间必须包含在'jersey.config.server.provider.packages' init-param中

    不需要任何其他设置(例如'com.sun.jersey.spi.container.ContainerRequestFilters'init-param或ResourceConfig)

  • 0

    我有同样的问题,JAX-RS 2,泽西和下面的注释修复它

    @PreMatching
    
  • 0

    我们在ResourceConfig实现类中缺少以下调用:

    register(CorrelationIdFilter.class);
    
  • 1

    好吧,我没有得到 jersey.config.server.provider.packages init参数不仅需要引用服务类(API endpoints ),还需要引用包括过滤器在内的所有类 .

    它现在有效:

    <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>
    
  • 2

    我还必须将 @Provider JAX-RS注释添加到我的过滤器中 .
    这使得在JAX-RS扫描阶段可以发现滤波器 .

    @Provider
    public class MyAppFilter implements ContainerRequestFilter {
        // filter logic
    }
    
  • 0

    一些提示:

    • 确保您使用的是JAX-RS 2.17版 .

    • 确保您在过滤器中使用了正确的导入:

    • import javax.ws.rs.container.ContainerRequestContext;

    • import javax.ws.rs.container.ContainerRequestFilter;

    • 添加 @Provider 注释

  • 0

    您可以使用 JerseyServletFactory 手动注册 ContainerRequestFilter ,而不是使用 @Provider 注释(在我的情况下不起作用):

    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();
    
  • 33

    而不是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);
    
  • 22

    如果你像我一样被困,请注意TomEE 1.7.X使用JAX-RS 1.1,它不包含ContainerRequestFilter .

  • 5

    对于在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 >
    

相关问题