addCorsMappings

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport{

    /**
     * 跨域配置
     * addMapping:配置可以被跨域的路径,可以任意配置,可以具体到直接请求路径。
     * allowedMethods:允许所有的请求方法访问该跨域资源服务器,如:POST、GET、PUT、DELETE等。
     * allowedHeaders:允许所有的请求header访问,可以自定义设置任意请求头信息,如:"X-TOKEN"
     * allowedOrigins:允许所有的请求域名访问我们的跨域资源,可以固定单条或者多条内容,如:"http://
     * www.baidu.com",只有百度可以访问我们的跨域资源。
     * @param registry
     */
    @Override
    protected void addCorsMappings(CorsRegistry registry) {
        super.addCorsMappings(registry);
        registry.addMapping("/**")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowedOrigins("http://localhost:3000");
    }
}

Filter

@WebFilter
@Component
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        /**
         * 可接受的域名请求,"*"表示接受任意域名的请求
         */
        response.setHeader("Access-Control-Allow-Origin", "http://localhost:3000");

        /**
         * 该字段必需,它的值是逗号分隔的一个字符串,表明服务器支持的所有跨域请求的方法。
         * 注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
         */
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");

        /**
         * 表明服务器支持的所有头信息字段,不限于浏览器在"预检"中请求的字段。
         */
        response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");

        /**
         * 该字段可选
         * 用来指定本次预检请求的有效期,单位为秒。
         */
        response.setHeader("Access-Control-Max-Age", "3600");

        /**
         * 是否允许发送Cookie,需要客户端和服务器共同合作
         * 服务器:设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。
         * 这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。
         * 客户端:
         * 开发者必须在AJAX请求中打开withCredentials属性。如:
         * var xhr = new XMLHttpRequest();
         * xhr.withCredentials = true;
         * 否则,即使服务器同意发送Cookie,浏览器也不会发送。
         */
        response.setHeader("Access-Control-Allow-Credentials", "true");

        /**
         * 该字段可选
         * 允许XMLHttpRequest对象的getResponseHeader()方法能拿到FooBar字段的值
         */
        response.setHeader("Access-Control-Expose-Headers", "FooBar");

        /**
         * 支持HTTP 1.1
         */
        // response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");

        /**
         * 支持HTTP 1.0. response.setHeader("Expires", "0");
         */
        // response.setHeader("Pragma", "no-cache");

        filterChain.doFilter(servletRequest, servletResponse);
    }
}

原文链接:https://miansen.wang/2018/11/28/1/