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

问题描述 投票:0回答:3

我有一个带有

@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"

java spring spring-boot servlets servlet-filters
3个回答
4
投票

不幸的是,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 对 CORS 的本机支持。你不需要任何过滤器。



0
投票

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

Spring CORS

© www.soinside.com 2019 - 2024. All rights reserved.