本文主要讲的是使用CORE解决跨域问题
跨域问题是由于浏览器的"同源策略"(CORS)导致的"医院请求"错误。浏览器出于安全考虑,会在网页进行请求时对"异源请求"做出一些限制,导致在某些情况下响应会被拦截,从而出现跨域问题。
源 = 协议 + 域名 + 端口,组成,三者一致为同源,反之为异源。
简单说就是前端使用http://localhost:8080,后端使用http://localhost:8081,由于端口号不一致就会导致跨域问题。
在发生跨域时浏览器为了安全起见
1.会首先发送一个OPTIONS类型的请求,该请求是测试类型的,又称之为options嗅探,同时会在header中带上origin,判断是否又跨域请求权限,
2.然后服务器相应Access-Control-Allow-Origin的值,该值会与浏览器的origin值进行匹配,如果能够匹配通过,则表示有跨域访问的权限。
3.跨域访问权限检查通过,会正式发送POST请求。
使用gin中间件的方式设置全局跨域配置,用以返回Access-Control-Allow-Origin和浏览器进行匹配。
func Core() gin.HandlerFunc {
return func(context *gin.Context) {
method := context.Request.Method
origin := context.Request.Header.Get("Origin")
var headerKeys []string
for k, _ := range context.Request.Header {
headerKeys = append(headerKeys, k)
}
headerStr := strings.Join(headerKeys, ",")
if headerStr != "" {
headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
} else {
headerStr = "access-control-allow-origin, access-control-allow-headers"
}
if origin != "" {
context.Writer.Header().Set("Access-Control-Allow-Origin", "*")
context.Header("Access-Control-Allow-Origin", "*") // 设置允许访问所有域
context.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") //允许访问的方式
context.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
context.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar")
context.Header("Access-Control-Max-Age", "172800")
context.Header("Access-Control-Allow-Credentials", "false")
context.Set("content-type", "application/json") 设置返回格式是json
}
if method == "OPTIONS" {
context.JSON(http.StatusOK, "Options Request!")
}
//处理请求
context.Next()
}
}
1.Access-Control-Allow-Headers: 用于 preflight request (预检请求)中,列出了将会在正式请求的 Access-Control-Request-Headers 字段中出现的首部信息。
2.Access-Control-Allow-Methods: 在对 preflight request.(预检请求)的应答中明确了客户端所要访问的资源允许使用的方法或方法列表。
3.Access-Control-Expose-Headers: 列出了哪些首部可以作为响应的一部分暴露给外部,默认情况下只有7种。这里面我们全部列出,用于可以让客户端访问到其他的首部信息。
4.Access-Control-Allow-Credentials:响应报头指示的请求的响应是否可以暴露于该页面。当true值返回时它可以被暴露。当作为对预检请求的响应的一部分使用时,它指示是否可以使用凭证进行实际请求。请注意,简单的GET请求不是预检的,所以如果请求使用凭证的资源,如果此资源不与资源一起返回,浏览器将忽略该响应,并且不会返回到 Web 内容。
5.Access-Control-Max-Age响应 header 指示多长时间的结果预检请求(即包含在所述信息Access-Control-Allow-Methods和Access-Control-Allow-Headers的 headers )可以被缓存。
上面参考文章:HTTP header中Access-Control-开头的响应头