1. 是什么?
同源策略
同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS、CSRF等攻击。
所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。
跨域 (cors)
cross-origin resource sharing:当协议、子域名、主域名、端口号中任意一个不相同时,都算作不同域。
不同域之间相互请求资源,就算作“跨域”。例如:
http://localhost:8080 -> http://localhost:8088
2. 为什么?
浏览器拦截
跨域并不是没有发出请求,其实请求能发出去,服务端收到请求并正常返回结果,只是结果被浏览器拦截了。
浏览器为了阻止用户读取到另一个域名下的内容,拦截了ajax响应。
3. 怎样解决?
CORS设置头
只要服务器端设置相应的头允许跨域即可。
Access-Control-Allow-Origin
根据Reuqest请求头中的Origin来判断该请求的资源是否可以被共享。
如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,这个回应的头信息没有包含Access-Control-Allow-Origin字段(该字段的值为服务端设置Access-Control-Allow-Origin的值)便知出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。此时HTTP的返回码为200,所以 这种错误无法通过状态码识别。
Access-Control-Allow-Credentials
Access-Control-Allow-Credentials:truexhr.withCredentials=true
*
Access-Control-Max-Age
可选字段,指定了一个预请求将缓存多久,在缓存失效前将不会再发送预请求。
Access-Control-Allow-Methods
作为预请求Response的一部分,指定了真实请求可以使用的请求方式。
Access-Control-Allow-Headers
作为预请求Response的一部分,指定了真实请求可以使用的请求头名称(header field names)。
golang实现
CORSCORS
golangHTTP
示例
ajax.html
8000port.go
9000port.go
如果注释掉Access-Control-Allow-Origin,不能跨域访问,报如下错误(console):
response Headers:
参考:
1. 跨域问题及解决方法 nginx部署 sinksmell https://github.com/sinksmell/lanblog.git
3. jsonp cros
4. jsonp cors nginx nodejs websocket
5. ajax 廖雪峰
7. golang server 跨域解决总结 动态许可跨域,根据不同url实现不同跨域