解决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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。