zoukankan      html  css  js  c++  java
  • GoGin 跨域处理

    背景

    跨域一般有两种方法:

    • 网络代理层,如nginx层拦截处理;
    • 后端服务处理;

    这里简单说下Go Gin框架的解决办法

    解决方法

    需要在 Gin 中提供了 middleware (中间件) 来处理请求前后的前置和后置逻辑。

    中间件文件:

    package middleware
    
    import (
       "github.com/gin-gonic/gin"
       "net/http"
    )
    
    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()
    	}
    }
    

      

    应用中间件:

    package main
    
    import(
      "gin/middleware"
      "github.com/gin-gonic/gin"
    )
    
    func main(){
       gin.SetMode(gin.ReleaseMode)
       engine = gin.Default()
       engine.Use(middleware.Cors())
    }
    

      

      

  • 相关阅读:
    图片采集
    资源(先备着)
    Memories of Vladimir Arnold 摘录
    Tribute to Vladimir Arnold 摘录
    Textbooks, Testing, Training: How We Discourage Thinking 笔记
    每天都有杰出数学家去世?(挖坑)
    I'm angry——人教B版选修2-3上的一个错误
    How to Study as a Mathematics Major 的笔记
    读《桑榆忆往》做的一点笔记
    《近代欧氏几何学》笔记
  • 原文地址:https://www.cnblogs.com/-wenli/p/15708870.html
Copyright © 2011-2022 走看看