因項目需要,前端采用 vue2+axios 開發,后端采用 Go語言 gin 框架,此時想實現前后台分離跨域的情況下攜帶 cookie。
Vue 前端地址及端口 http://localhost:8080/
Go 后端地址及端口 http://localhost:8090/
1.前端 axios.defaults.withCredentials 設置為 true
axios.defaults.withCredentials = true
下圖

2.后端跨域中間件設置
package middleware
import (
"github.com/gin-gonic/gin"
"net/http"
)
//Cors 跨域中間件
func Cors() gin.HandlerFunc {
return func(ctx *gin.Context) {
//以下是引用跨域 cookie
ctx.Writer.Header().Set("Access-Control-Allow-Origin", ctx.GetHeader("Origin"))
ctx.Writer.Header().Set("Access-Control-Allow-Headers", "X-Requested-With,Content-Type")
ctx.Writer.Header().Set("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS")
ctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
//如果請求方法為 options 則寫入200
if ctx.Request.Method == http.MethodOptions {
ctx.AbortWithStatus(http.StatusOK)
} else {
ctx.Next()
}
}
}
注意 Access-Control-Allow-Origin 不能設置為 * ,要設置為前端的域名(http://localhost:8080/)或者直接用 ctx.GetHeader("Origin"),另 Access-Control-Allow-Credentials 必須設置為 true。
3.Gin 后端 session 、Cookie 設置
session 包我用的下面兩個
"github.com/gin-contrib/sessions"
"github.com/gin-contrib/sessions/cookie"
r:=gin.Default()
//配置session
store := cookie.NewStore([]byte("secret"))
store.Options(sessions.Options{
Path: "/",
MaxAge: 0,
Secure: true,
SameSite: 4,
})
r.Use(sessions.Sessions("MY_SESSION_ID", store))
這里需要注意:
Secure 需要設置為 true
SameSite 需要設置為 4
谷歌低版本瀏覽器(低於Chrome 80) SameSite 使用默認值也可以正常使用,但谷歌瀏覽器從 Chrome 80 版本中默認屏蔽所有第三方 Cookie,即默認為所有 Cookie 加上 SameSite=Lax 屬性,並且拒絕非Secure的Cookie設為 SameSite=None
所以 SameSite 需設置為 4,即 None。
參考資料:
https://www.ruanyifeng.com/blog/2019/09/cookie-samesite.html
https://blog.csdn.net/carry_chenxiaodong/article/details/114281994
