解决前端Vue3+vite+axios+cookie跨域报错问题 后端Go+gin
自己在写一个项目,目前遇到了问题:前端需要向后端执行ajax请求获取数据,需要传递cookie。如果使用默认的代码不进行配置则会出现跨域问题cors报错,本文将解决问题.
前端(node.js+Vite):http://localhost:5173
后端(golang + gin):http://localhost:8088/
问题出现
前端需要向后端请求数据/api/devices/snlspjrnzxcevyfk/info,后端通过前端传递过来的cookie进行身份识别,授权成功返回200,JSON数据, 失败返回401未授权或404.
当我们使用默认参数不做配置时,直接请求会被拦截,进而无法获取数据。参考网上的教程在解决请求跨域后,又少有解决cookie传递的,参考几篇资料后,结合本人项目,目前问题已解决。
cookie:IOMAuth
解决措施
前端部分
vite.config.js
export default defineConfig({ plugins: [ vue(), AutoImport({ resolvers: [ElementPlusResolver()], }), Components({ resolvers: [ElementPlusResolver()], }), ], resolve: { alias: { '@': fileURLToPath(new URL('./src', import.meta.url)) } }, server: { host: '0.0.0.0', proxy: { '/api': { target: 'http://localhost:8088/', changeOrigin: true, secure: false, ws: true, followRedirects: true, rewrite: path => path.replace(/^\/api/, ''), onProxyReq(proxyReq, req, res) { originHost = req.headers['x-forwarded-for'] const cookie = req.headers['cookie'] if (cookie) { proxyReq.setHeader('cookie', cookie) } }, onProxyRes(proxyRes, req, res) { if (proxyRes.headers['set-cookie']) { proxyRes.headers['Access-Control-Allow-Credentials'] = 'true'; } }
}, } }, })
|
axios配置 axiosInstance.js
import axios from 'axios'
axios.defaults.withCredentials = true;
const API = axios.create({ baseURL:'http://localhost:8088', timeout: 2000, withCredentials:true })
export default API
|
后端
go gin路由设置
func RouterInit() { global.Router = gin.Default() global.Router.Use(func(c *gin.Context) { method := c.Request.Method origin := c.Request.Header.Get("Origin") if 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, IOMAuth") c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers") c.Header("Access-Control-Max-Age", "172800") c.Header("Access-Control-Allow-Credentials", "true") } if method == "OPTIONS" { c.JSON(http.StatusOK, "ok!") }
defer func() { if err := recover(); err != nil { logrus.Panic("Panic info is: %v", err) } }() c.Next() }) regRouter() global.Router.Run(":" + global.WebPort) }
|