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())
    }
    

      

      

  • 相关阅读:
    两个多项式的卷积【NTT】
    Determinant【矩阵的行列式的求法】
    2020 CCPC 长春题解
    Easy Equation【差分+前缀和】
    CF1433G-Reducing Delivery Cost【最短路】
    Interstellar Hunter【2020CCPC秦皇岛-I】
    P4721 【模板】分治 FFT
    关于Spring事务传播行为的个人见解
    InnoDB MVCC实现原理整理
    Nginx学习笔记(五、Nginx缓存与限流)
  • 原文地址:https://www.cnblogs.com/-wenli/p/15708870.html
Copyright © 2011-2022 走看看