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实现不同跨域