@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:8080
或localhost: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 请求的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot项目@WebFilter过滤器urlPatterns配置失效的解决方案,以及多个filter过滤器demo