什么叫做跨域
"跨域"是一个网络安全的概念,起源于浏览器的同源策略。同源策略是一种约定,它是由网景(Netscape)公司提出的一个重要的安全策略。所谓同源是指"协议+域名+端口号"三者相同,只要不同时,就算是不同源。
换句话说,"跨域"指的是从一个域名的网页去请求另一个域名的资源。例如,"http://website1.com"的网页通过Ajax获取"http://website2.com"的数据,由于不满足同源策略,这种行为默认是被浏览器禁止的。
但有时候,我们为了满足业务需求,需要进行跨域访问,这时候就需要按照一定的方式(比如修改HTTP响应头,或者设置JSONP等方法)来实现跨域访问。
Gin如何处理跨域呢
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func Cors() gin.HandlerFunc {
return func(c *gin.Context) {
method := c.Request.Method
c.Header("Access-Control-Allow-Origin", "*")
c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization, Token")
c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS")
c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type")
c.Header("Access-Control-Allow-Credentials", "true")
if method == "OPTIONS" {
c.AbortWithStatus(http.StatusNoContent)
}
// 处理请求
c.Next()
}
}
func main() {
r := gin.New()
r.Use(Cors())
r.GET("/test", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello test",
})
})
r.Run()
}
在上面参数的意义主要是:
Access-Control-Allow-Origin
: 这个Header定义了那些域名可以访问资源。如果设置为“*”,则表示允许所有域名进行访问。
Access-Control-Allow-Headers
: 这个Header定义浏览器在实际请求中可以携带哪种类型的header。通常设置为一些自定义的Header,如上例中的"Content-Type,AccessToken,X-CSRF-Token, Authorization, Token",这几项代表这些Header是可以被允许传递的。
Access-Control-Allow-Methods
: 这个Header定义了可以支持哪些HTTP动词,如“POST, GET, OPTIONS”。
Access-Control-Expose-Headers
: 这个Header让服务器把允许浏览器访问的header白名单填入该字段,让前端可以使用 getResponseHeader 获取到其他信息。
Access-Control-Allow-Credentials
: 这个Header定义了是否允许发送Cookie。true表示允许,false表示禁止。通常我们设为true,这样做的目的是为了在跨站请求时能够保持用户的登录状态
在上述代码中,Cors是一个中间件,用来自定义跨域访问的规则。这些规则通过设置HTTP header来实现,通过c.Header
方法来设置。然后,我们将这个中间件加入到router的处理链中,这样每次request都会先经过Cors这个中间件。
这样,当你在浏览器中对"/test"路径发起请求时,就能正常接收到响应了,实现了跨域访问。