@WebFilter(urlPatterns) 未正确映射 http 请求

Posted

技术标签:

【中文标题】@WebFilter(urlPatterns) 未正确映射 http 请求【英文标题】:@WebFilter(urlPatterns) not mapping http request properly 【发布时间】:2018-09-12 08:23:11 【问题描述】:

我有一个带有 @GetMapping(value = "/getToken") 的函数,它写入 json 内容。

@GetMapping(value = "/getToken")
    public String getToken(HttpServletRequest request, HttpServletResponse response, Model model) 
             // jsonObject
              PrintWriter out = response.getWriter();
                out.print(jsonObject);

现在,用户可以使用这样的 url 向上述映射发出 GET 请求:

localhost:8080/getToken?username="username"&password="password"

我还创建了一个名为 CORSFilter 的类,它实现了 javax.servlet.Filter,我希望这个过滤器只拦截那些在请求路径中有 /getToken 的请求。

@WebFilter(urlPatterns = "/getToken")
    public class CORSFilter implements Filter 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
      //validate user and password
            chain.doFilter(requestToUse, responseToUse);
    
    

现在,当我在浏览器中点击localhost:8080localhost:8080/thankyou 时,就会调用上述过滤器。

我怎样才能阻止这种情况?仅当 url 路径为 localhost:8080/getToken?username="user"&password="pass"

时,我才想调用上面的过滤器

【问题讨论】:

【参考方案1】:

不幸的是,Spring Boot 不支持使用 WebFilter 声明的过滤器的 urlPatterns。如果需要应用模式,则必须将过滤器声明为 bean,并在配置类中为该 bean 声明过滤器注册。例如:

@Bean
public FilterRegistrationBean<CORSFilter> corsFilterRegistration() 
    FilterRegistrationBean<CORSFilter> filterRegistrationBean =
        new FilterRegistrationBean<>(corsFilter());
    filterRegistrationBean.setUrlPatterns(Collections.singleton("/getToken"));
    return filterRegistrationBean;


@Bean
public CORSFilter corsFilter() 
    return new CORSFilter();

但是请注意,Spring Boot 有 native support for CORS。你不需要任何过滤器。

【讨论】:

它是否也适用于非 Spring Boot 应用程序?【参考方案2】:

您可以使用拦截器-HandlerInterceptor。操作方法请参考以下网址。

https://www.journaldev.com/2676/spring-mvc-interceptor-example-handlerinterceptor-handlerinterceptoradapter

【讨论】:

【参考方案3】:

如果是纯jsp应用那么你需要在web.xml中声明它因为@WebFilter不保证过滤器的执行顺序或者如果它是基于spring的应用那么你可以在方法级别使用 @CrossOrigin 或声明一个 bean 来过滤每个 url,如下面的 url 中提到的

Spring CORS

【讨论】:

以上是关于@WebFilter(urlPatterns) 未正确映射 http 请求的主要内容,如果未能解决你的问题,请参考以下文章

WebFilter urlPatterns 被忽略

@WebFilter注解

SpringBoot项目@WebFilter过滤器urlPatterns配置失效的解决方案,以及多个filter过滤器demo

@WebFilter注解

Springboot整合Filter

Springboot过滤器注解简笔