切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
Go - Gin 解决跨域问题跨域配置
作者:ych
### 一、关于跨域解决方案 关于跨域的解决方法,大部分可以分为 2 种 >1.nginx反向代理解决跨域 2.服务端设置Response Header(响应头部)的Access-Control-Allow-Origin 对于后端开发来说,第 2 种的操作性更新灵活,这里也讲一下 Gin 是如何做到的 ### 二、使用步骤 在 Gin 中提供了 middleware (中间件) 来做到在一个请求前后处理响应的逻辑,这里我们使用中间来做到在每次请求是添加上 Access-Control-Allow-Origin 头部 #### 1.编写一个中间件 可以`middleware.go`包下创建 ``` package http import ( "log" "net/http" "github.com/gin-gonic/gin" ) func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method origin := c.Request.Header.Get("Origin") //请求头部 if origin != "" { //接收客户端发送的origin (重要!) c.Writer.Header().Set("Access-Control-Allow-Origin", origin) //服务器支持的所有跨域请求的方法 c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") //允许跨域设置可以返回其他子段,可以自定义字段 c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session") // 允许浏览器(客户端)可以解析的头部 (重要) c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") //设置缓存时间 c.Header("Access-Control-Max-Age", "172800") //允许客户端传递校验信息比如 cookie (重要) c.Header("Access-Control-Allow-Credentials", "true") // //c.Header("Content-Type", "application/json") } //允许类型校验 if method == "OPTIONS" { c.Header("Access-Control-Allow-Origin", "*") c.Header("Access-Control-Allow-Headers", "Content-Type,AccessToken,X-CSRF-Token, Authorization") //自定义 Header 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") c.AbortWithStatus(http.StatusNoContent) } defer func() { if err := recover(); err != nil { log.Printf("Panic info is: %v", err) } }() c.Next() } } ``` #### 2.使用 ``` r := gin.Default() r.Use(Cors()) ``` #### 3.注意事项 需要将`r.Use(Cors())`在使用路由前进行设置,否则会导致不生效 反例 ``` r := gin.Default() pingGroup := r.Group("ping") { pingGroup.GET("/", Ping) } r.Use(middlewares.Cors()) ``` 这样会导致跨域配置不生效
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1