Jersey ContainerRequestFilter未触发

koy*_*aga 38 jersey jersey-2.0

我正在尝试使用a ContainerRequestFilter在基于Tomcat的Jersey应用程序上强制执行某些身份验证.我按照这个文件.问题:永远不会触发过滤器

过滤类:

@Provider
public class AuthFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext)
        throws IOException {

        // MY AUTHENTICATION CODE GOES HERE

    }
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

koy*_*aga 34

好吧,我没有得到jersey.config.server.provider.packagesinit参数不仅需要引用服务类(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>
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,`com.sun.jersey.spi.container.ContainerRequestFilters`和`com.sun.jersey.api.json.POJOMappingFeature`是无用的.这些是Jersey 1.x属性.他们对Jersey 2.x没有影响 (5认同)
  • 默认行为是递归扫描,因此您也可以使用单个基本包`com.hck.debate.rest` (2认同)

uri*_*ris 23

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

@Provider
public class MyAppFilter implements ContainerRequestFilter {
    // filter logic
}
Run Code Online (Sandbox Code Playgroud)

  • 同样没有注释没有发生 (2认同)

ACV*_*ACV 5

一些提示:

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

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