解决golang gin框架跨域及注解的问题

 更新时间:2021年03月15日 10:53:17   作者:Chelydra  
这篇文章主要介绍了解决golang gin框架跨域及注解的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

在golang的路上缓慢前进 Gin框架 跨域问题的解说与方法

代码如下:

package main 
import (
	"github.com/gin-gonic/gin"
	"awesomeProject/app/app_routers"
	"strings"
	"fmt"
	"net/http"
) 
 
/* 路由初始化*/
var (
	engine = gin.Default()
) 
func main() {
 
	// 允许使用跨域请求	 全局中间件
	engine.Use(Cors())
	//router.Use(cors.Default())
	// 传参 设定路由组 允许路由组使用路由
	app_routers.Router(engine)
	// 启动路由 设定端口
	Cors()
	engine.Run(":11000")	//运行启动端口 
} 
//
// 跨域
func Cors() gin.HandlerFunc {
	return func(c *gin.Context) {
		method := c.Request.Method		//请求方法
		origin := c.Request.Header.Get("Origin")		//请求头部
		var headerKeys []string								// 声明请求头keys
		for k, _ := range c.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 != "" {
			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方法
		if method == "OPTIONS" {
			c.JSON(http.StatusOK, "Options Request!")
		}
		// 处理请求
		c.Next()		//	处理请求
	}
}

补充:gin框架中间件解决跨域问题

代码如下:

func Cors(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方法,因为有的模板是要请求两次的
 if method == "OPTIONS" {
  c.AbortWithStatus(http.StatusNoContent)
 }
 // 处理请求
 c.Next()
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

相关文章

  • Go秒爬博客园100页新闻

    Go秒爬博客园100页新闻

    利用go语言的协程并发优势爬取网页速度相当之快,博客园100页新闻标题只需一秒即可全部爬取,跟着小编一起去看看如何实现的,希望大家可以从中受益
    2018-09-09
  • 基于gin的golang web开发:路由示例详解

    基于gin的golang web开发:路由示例详解

    这篇文章主要介绍了基于gin的golang web开发:路由示例详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • goland设置控制台折叠效果

    goland设置控制台折叠效果

    这篇文章主要介绍了goland设置控制台折叠效果,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • golang 格式化输入输出操作

    golang 格式化输入输出操作

    这篇文章主要介绍了golang 格式化输入输出操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang中之strconv包的具体使用方法

    golang中之strconv包的具体使用方法

    这篇文章主要介绍了golang中之strconv包的具体使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Golang字符串的拼接方法汇总

    Golang字符串的拼接方法汇总

    字符串拼接在日常开发中是很常见的需求,今天我们来探讨下如何用golang来实现字符串的拼接
    2018-10-10
  • go语言静态库的编译和使用方法

    go语言静态库的编译和使用方法

    这篇文章主要介绍了go语言静态库的编译和使用方法,本文以windows平台为例,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • go语言变量定义用法实例

    go语言变量定义用法实例

    这篇文章主要介绍了go语言变量定义用法,实例分析了go语言变量的定义及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • 利用Golang实现TCP连接的双向拷贝详解

    利用Golang实现TCP连接的双向拷贝详解

    公司中遇到了一个使用golang编写的agent程序,所以这篇文章主要给大家介绍了关于利用Go如何实现TCP连接的双向拷贝的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考,下面随着小编来一起看看吧。
    2017-09-09
  • Go语言集成mysql驱动、调用数据库、查询数据操作示例

    Go语言集成mysql驱动、调用数据库、查询数据操作示例

    这篇文章主要介绍了Go语言集成mysql驱动、调用数据库、查询数据操作,结合实例形式分析了Go语言安装mysql驱动包、连接mysql数据库及查询等相关操作技巧,需要的朋友可以参考下
    2019-06-06

最新评论