从java到Go解决Gin中CORS跨域

Posted 幽灵雾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从java到Go解决Gin中CORS跨域相关的知识,希望对你有一定的参考价值。

【提问】

在Golang的Gin款家中,如何通过CORS解决跨域问题

【解答】

具体步骤如下:

1、服务端进行CORS头配置

在Go工程main.go文件中,增加cors的配置,代码如下。这里有两个非常重要的点需要注意:

1、cors的配置router.Use(Cors()),一定要放在router.GET()等方法之前,先执行cors配置,不然会出现cors 不生效的情况

2、设置Header时,「Access-Control-Allow-Credentials=true」和「Access-Control-Allow-Origin=“*”」有冲突,所以如果设置了「Access-Control-Allow-Credentials=true」,则「Access-Control-Allow-Origin」不能配置通配符,而需要具体写出每一个需要跨域的地址:「http://www.test.com」等

package main

import (
	"github.com/gin-gonic/gin"
	"net/http"
)

func main() 
	router := gin.Default()
	router.Use(Cors())

	router.GET("/test", func(c *gin.Context) 
		c.String(http.StatusOK, "Hello world! 这时一个基于Gin得cors跨域web服务")
	)

	router.Run(":8081")


// 处理跨域请求,支持options访问
func Cors() gin.HandlerFunc 
	return func(c *gin.Context) 
		//Access-Control-Allow-Credentials=true和Access-Control-Allow-Origin="*"有冲突
		//故Access-Control-Allow-Origin需要指定具体得跨域origin
		c.Header("Access-Control-Allow-Origin", "http://www.fullstars.com:8000")
		c.Header("Access-Control-Allow-Credentials", "true")
		c.Header("Access-Control-Allow-Headers", "content-type")
		c.Header("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE")
		//c.Header("Access-Control-Expose-Headers", "*")
		if c.Request.Method == "OPTIONS" 
			c.JSON(http.StatusOK, "")
			c.Abort()
			return
		
		c.Next()
	


代码写好后,服务端启动即可。

2、客户端请求配置

这里客户端以Vue为例(reactjs方式类似),我们使用axios来进行服务请求(axios的安装使用这里不做介绍)。
我们使用axios创建实例时,打开「withCredentials」配置(该配置为true时,才能允许进行cookie的写操作),如下:

// 引入axios
import axios from 'axios';

export const baseURL = 'http://www.test.com';

// 创建实例
const instance = axios.create(
  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL,
  // `timeout` 指定请求超时的毫秒数。
  // 如果请求时间超过 `timeout` 的值,则请求会被中断
  timeout: 1000 * 10, // 默认值是 `0` (永不超时)
  // 自定义请求头
  headers: 
    'Content-Type': 'application/json;charset=utf-8',
  ,
  // `withCredentials` 表示跨域请求时是否需要使用凭证
  withCredentials: true,
);

3、客户端进行请求

客户端简单写一个测试请求:

test() 
	ajax(
	  url: '/test',
	  method: 'get',
	  params: ,
	)
	  .then((data) => 
	  )
	  .catch((error) => 
	  )
	  .finally(() => 
	  );

请求后,会发现已经可以跨域进行调用了

以上是关于从java到Go解决Gin中CORS跨域的主要内容,如果未能解决你的问题,请参考以下文章

从java到Go解决Gin中CORS跨域

从java到Go解决Gin中CORS跨域

Go-gin CORS 跨域中间件

从0开始的go+websocket构建五子棋对战系统

从java到Go搭建Go的Web框架Gin

从java到Go搭建Go的Web框架Gin