2013-06-25 25 views
34

我试图使用ContainerRequestFilter在基于Tomcat的Jersey应用程序上强制进行一些身份验证。我跟着this document。 问题:过滤器永远不会触发Jersey ContainerRequestFilter未触发

过滤器类:

@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> 

回答

29

好吧,我没有得到的jersey.config.server.provider.packages初始参数需要不仅引用服务类(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> 
+0

你上面的代码工作,因为它是在Tomcat,也许是与GLAS鱼 –

+0

默认行为是循环扫描不同,所以你也可以只使用单一的基础包' com.hck.debate.rest' –

+3

还要注意'com.sun.jersey.spi.container.ContainerRequestFilters'和'com.sun.jersey.api.json.POJOMappingFeature'没有用处。这些是Jersey 1.x属性。他们对泽西岛没有影响2.x –

21

我也只好到@Provider JAX-RS注解添加到我的过滤器。
这使得过滤器可在JAX-RS扫描阶段发现。

@Provider 
public class MyAppFilter implements ContainerRequestFilter { 
    // filter logic 
} 
+2

同样在这里没有注释什么都没有发生 –

+0

它是否真的有必要“@Provider”? – VedX

+0

是的,我只需添加@Provider注释。包扫描已正确设置 – ruediste

2

的最低要求与球衣上班过滤器:

  • 添加注释@Provider过滤类
  • 过滤器类的命名空间已被列入“jersey.config.server.provider .packages' INIT-PARAM

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

+0

是否真的有必要使用“@Provider”? – VedX

+0

是的,是的。 Jersey将仅加载指定命名空间中的标记类 – crazyman

2

我对JAX-RS 2,运动衫和下面的注释固定它

@PreMatching 
5

一些提示了同样的问题:

  1. 确保您使用JAX-RS版本2.17。
  2. 确保你使用正确的进口筛选器:

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

+0

它是否真的有必要使用“@Provider”? – VedX

+0

是的,它将组件注释为某种东西的提供者。它用于扩展基本的JAX-RS功能。 – ACV

0

而不是使用的@Provider注释(这并没有我的情况下工作),您可以手动注册您的ContainerRequestFilterJerseyServletFactory

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(); 
+0

这段代码应该放在哪里? – jon

+0

@jon初始化期间。我将代码放置在JettyHttpServer的创建和启动之间,其他需要在启动时初始化的数据(数据源,资源,DAO等) –

+0

我做了同样的事情,现在我想调用销毁(对于某些自定义清理任务)的servlet。我无法获得此过滤器的参考以在关机事件中调用destroy。 – Atul

0

相反javax.ws.rs的,我用的com.sun。球衣和它的工作

import com.sun.jersey.spi.container.ContainerRequestFilter import com.sun.jersey.spi.container.ContainerRequest

Dropwizard用户需要这样做

environment.jersey().getResourceConfig() 
      .getContainerRequestFilters() 
      .add(filter); 
0

如果你被困像我一样,注意TomEE 1.7.X使用JAX-RS 1.1,其中不包括ContainerRequestFilter 。

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 >