@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");
}
}
@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);
}
}