跨域 CrossOrigin
重要参考文档:
http://frontenddev.org/article/ajax-browser-cross-domain-request-access-control.html#heading-3-16
https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
解决跨域访问sessionid不一致的问题:
添加”Access-Control-Allow-Credentials”, “true”
浏览器默认不支持ajax跨域访问, ajax解决跨域限制:
url: “http://…….”,
type: ‘GET’,
dataType: ‘JSONP’,
success: function (data) { }
@crossOrigin注解针对Controller类或方法(所以prehandle处使用注解没用),也可通过webmvc全局指定:
private String[] alloweredOrigins = {"http://oss.cdn.letv.cn"};
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins(alloweredOrigins)
.allowCredentials(true)
.maxAge(3600)
.allowedHeaders("Origin", "X-Requested-With", "Content-Type", "Accept");
}
};
}
运行时何处会添加responseHeader的Origin?
prehandle:
RequestMapping方法(该方法执行结束后添加)
posthandle
aftercomplish
crossOrigin注解中的method,如果写了会覆盖requestMethod中指定的,不写的话默认就是requestMethod中指定的。
request中默认会设定自己的Origin。
如上链接官方文档所说,只有简单请求才会触发preflight.
所以postman测试本地程序时:
get方法,以及body为空的post,设置的跨域不起作用,request中header的origin为空。就跟没设置一样。 浏览器get也不起作用
body包含了文件的post,设置的跨域起作用。此时request中header的origin不为空,response也不为空。(可以查看本地的origin)
注意maxAge,如果某个地方未能跨域访问,由于其缓存,导致其它本来能跨域访问的也不能访问了。
/** 匹配的是 /开始的所有路径及文件,包括//domain,也包括/domain
/* 匹配的是/开始的,包括/domain,但不包括//domain,也不包括/domain/file
所以如果设置了但不起作用,很可能是以下两个原因:
- 全局设定时路径没匹配对
- 多个路径的情况下有遗漏的路径没有设定,缓存的原因。