解决golang gin框架跨域及注解的问题
在golang的路上缓慢前进Gin框架跨域问题的解说与方法
代码如下:
packagemain
import(
"github.com/gin-gonic/gin"
"awesomeProject/app/app_routers"
"strings"
"fmt"
"net/http"
)
/*路由初始化*/
var(
engine=gin.Default()
)
funcmain(){
//允许使用跨域请求 全局中间件
engine.Use(Cors())
//router.Use(cors.Default())
//传参设定路由组允许路由组使用路由
app_routers.Router(engine)
//启动路由设定端口
Cors()
engine.Run(":11000") //运行启动端口
}
//
//跨域
funcCors()gin.HandlerFunc{
returnfunc(c*gin.Context){
method:=c.Request.Method //请求方法
origin:=c.Request.Header.Get("Origin") //请求头部
varheaderKeys[]string //声明请求头keys
fork,_:=rangec.Request.Header{
headerKeys=append(headerKeys,k)
}
headerStr:=strings.Join(headerKeys,",")
ifheaderStr!=""{
headerStr=fmt.Sprintf("access-control-allow-origin,access-control-allow-headers,%s",headerStr)
}else{
headerStr="access-control-allow-origin,access-control-allow-headers"
}
iforigin!=""{
c.Writer.Header().Set("Access-Control-Allow-Origin","*")
c.Header("Access-Control-Allow-Origin","*") //这是允许访问所有域
c.Header("Access-Control-Allow-Methods","POST,GET,OPTIONS,PUT,DELETE,UPDATE") //服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求
//header的类型
c.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")
// 允许跨域设置 可以返回其他子段
c.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") //跨域关键设置让浏览器可以解析
c.Header("Access-Control-Max-Age","172800") //缓存请求信息单位为秒
c.Header("Access-Control-Allow-Credentials","false") // 跨域请求是否需要带cookie信息默认设置为true
c.Set("content-type","application/json") //设置返回格式是json
}
//放行所有OPTIONS方法
ifmethod=="OPTIONS"{
c.JSON(http.StatusOK,"OptionsRequest!")
}
//处理请求
c.Next() // 处理请求
}
}
补充:gin框架中间件解决跨域问题
代码如下:
funcCors(c*gin.Context){
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,PUT,PATCH,DELETE")
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")
//这里是解决vue那个坑
method:=c.Request.Method
//放行所有OPTIONS方法,因为有的模板是要请求两次的
ifmethod=="OPTIONS"{
c.AbortWithStatus(http.StatusNoContent)
}
//处理请求
c.Next()
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。