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

时间:2018-04-03 05:24:12

标签: java spring spring-boot servlets servlet-filters

我有一个函数 @GetMapping(value =" / getToken"),用于编写json内容。

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

现在,用户可以使用以下网址对上面的映射进行GET请求:

  

本地主机:8080 /用户名为gettoken ="用户名"&安培;密码="密码"

我还创建了一个名为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"

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

不幸的是,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。你不需要任何过滤器。

答案 2 :(得分:0)

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

Spring CORS