跳过泽西特定资源的请求过滤器

时间:2015-03-14 11:23:12

标签: java rest jersey

我正在开发一个平针项目,我使用令牌身份验证,并使用ContainerRequestFilter过滤所有请求并检查它是否有令牌,但请求包括登录和注册请求,但我们需要跳过这些请求。 。我如何跳过登录和注册请求的过滤?为了达到这个目的,球衣中是否有任何机制?

谢谢

1 个答案:

答案 0 :(得分:0)

据我所知,使用原始部署描述符( web.xml )没有这种行为的设施。

但是,如果这是自定义过滤器,您可以使用doFilter()方法中的简单检查请求网址,跳过排除路径。但是,由于您使用的是第三方过滤器,因此无法实现这一目标,但仍可实现此功能:

  1. 将您的第三方过滤器(ContainerRequestFilter)映射更改为另一个路径而不是通配符:

    <filter-mapping>
      <filter-name>containerRequestFilter</filter-name>
      <url-pattern>/tokenizedpaths/*</url-pattern>
    </filter-mapping>
    
  2. 声明一个新的过滤器(稍后会看到它的样子),它将映射到通配符路径以过滤所有请求,并被委派给 containerRequestFilter 仅当请求路径与排除的路径不匹配时(我选择 register 作为样本):

    <filter>
      <filter-name>filteringFilter</filter-name>
      <filter-class>com.sample.FilteringServletFilter</filter-class>
      <init-param>
        <param-name>excludedPaths</param-name>
        <param-value>/register</param-value>
      </init-param>
    </filter>
    
  3. FilteringServletFilter看起来像下面的内容:

    public class FilteringServletFilter implements Filter {
    
      private List<String> excludedPaths = new ArrayList<String>();
    
      public void init(FilterConfig config) throws ServletException {
        // You can declare a comma separated list to hold your excluded paths
        this.excludedPaths = Arrays.asList(config.getInitParameter("excludedPaths").split(","));
      }
    
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        String path = ((HttpServletRequest) request).getRequestURI();
        // If the url is one of excluded paths, then just continue with next filter
        if (this.excludedPaths.contains(path)) {
          chain.doFilter(request, response); 
          return;
        }
        // Otherwilse, forward the request to the needed filter
        else {
          request.getRequestDispatcher("/tokenizedpaths" + path).forward(request, response);
        }
      }
    
    }