原因
跨域问题是因为
浏览器
的同源策略
引起的,主要是为了安全
了解同源策略点这里
简而言之,如果protocol
、port
和host
有一个不相同就不是同源,就是跨域
解决方式
beego中解决跨域问题如下:
//main.go
func main() {
if beego.BConfig.RunMode == "dev" {
beego.BConfig.WebConfig.DirectoryIndex = true
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
}
//InsertFilter是提供一个过滤函数
beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
//允许访问所有源
AllowAllOrigins: true,
//可选参数"GET", "POST", "PUT", "DELETE", "OPTIONS" (*为所有)
//其中Options跨域复杂请求预检
AllowMethods: []string{"*"},
//指的是允许的Header的种类
AllowHeaders: []string{"*"},
//公开的HTTP标头列表
ExposeHeaders: []string{"Content-Length"},
//如果设置,则允许共享身份验证凭据,例如cookie
AllowCredentials: true,
}))
beego.Run()
}
没有跨域会怎样
网上比较经典的例子
如果 XMLHttpRequest 同源策略,那么黑客可以进行 CSRF(跨站请求伪造) 攻击:
1、用户登录了自己的银行页面http://mybank.com
,http://mybank.com
向用户的 cookie 中添加用户标识。
2、用户浏览了恶意页面http://evil.com
,执行了页面中的恶意 AJAX 请求代码。
3、http://evil.com
向http://mybank.com
发起 AJAX HTTP 请求,请求会默认把http://mybank.com
对应 cookie 也同时发送过去。
4、银行页面从发送的 cookie 中提取用户标识,验证用户无误,response 中返回请求数据。此时数据就泄露了。
而且由于 Ajax 在后台执行,用户无法感知这一过程。