当前位置: 首页 > news >正文

vue请求golang后端CORS跨域问题深度踩坑

文章目录

  • 问题描述
  • 解决方式

问题描述

小编最近开发一款测试工具,前端用VUE写的,后端用golang,前后端都写好了以后,想本地启动联调一下,没想到,这一启动就启动了2天才起来,问题出在哪了呢?

Access to XMLHttpRequest at 'http://localhost:8080/demo?text=xiaoli' from origin 'http://localhost:8000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

没错,跨域问题(下面贴的报错的url脱敏了),其实这个问题很常见,小编一点也不慌,因为小编知道加个配置就好了,就像下面一样

按照AI的解决方式,
前端需要在vue.config.js中加下配置

module.exports = {devServer: {proxy: {'/demo': {target: 'http://localhost:8080', // 目标服务器changeOrigin: true,             // 修改请求头中的 Origin 字段secure: false,                  // 如果使用 https 时设置为 true},},},
};

然后在服务端加个cors

package mainimport ("fmt""net/http"
)func handler(w http.ResponseWriter, r *http.Request) {// 设置允许跨域的头部w.Header().Set("Access-Control-Allow-Origin", "*")           // 允许所有来源w.Header().Set("Access-Control-Allow-Methods", "GET, POST") // 允许的请求方法w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") // 允许的请求头// 处理预检请求if r.Method == http.MethodOptions {return}// 发送响应数据fmt.Fprintf(w, "Hello, CORS-enabled world!")
}func main() {http.HandleFunc("/demo", handler)http.ListenAndServe(":8080", nil)
}

以上部分是ai给的解决方案

然后,小编一顿操作猛如虎,启动之后居然还是报错,反反复复检查了好几次,配置没问题啊

解决方式

最后在小编反复debug了一天之后终于发现了问题,小编在golang服务配置cors代码时,加在了这里

		baseGroup := router.Group("/go-components/api/demo")// 最刚开始加在这里了,当时想的是只对这个路由生效baseGroup.Use(middleware.Cors())baseGroup.POST("/getStoreInfo", webx.NewController(appKeyController.GetStoreInfo))

后来小编把这段代码加在了前面

router.Use(middleware.Cors())
baseGroup := router.Group("/go-components/api/demo")

然后重新启动就好了,太神奇了

func Cors() gin.HandlerFunc {return func(c *gin.Context) {method := c.Request.Methodorigin := c.Request.Header.Get("Origin")if origin != "" {c.Writer.Header().Add("Access-Control-Allow-Origin", origin)// 仅POST, GET, OPTIONS请求支持跨域c.Writer.Header().Add("Access-Control-Allow-Methods", "POST, GET, OPTIONS")c.Writer.Header().Add("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization, uid")c.Writer.Header().Add("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Cache-Control, Content-Language, Content-Type")c.Writer.Header().Add("Access-Control-Allow-Credentials", "true")}if method == "OPTIONS" {c.AbortWithStatus(http.StatusNoContent)}c.Next()}
}

注意2个点:
1、c.Writer.Header().Add("Access-Control-Allow-Origin", origin) ,这个Access-Control-Allow-Origin的值不能设置成*,会报错的。
2、cors的几个配置都要加在c.Writer.Header().Add里,而不是c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS"),别问我是什么知道的!!!

就这些吧

http://www.dtcms.com/a/303936.html

相关文章:

  • 【STM32】FreeRTOS 任务消息队列 和 中断消息队列的区别(六)
  • 14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)
  • “非参数化”大语言模型与RAG的关系?
  • 云原生MySQL Operator开发实战(五):扩展与生态系统集成
  • python使用ffmpeg录制rtmp/m3u8推流视频并按ctrl+c实现优雅退出
  • DateTime::ToString 日期时间文本格式化深度解析(C++)
  • Mysql InnoDB存储引擎
  • 2.快速开始
  • Windows下基于 SenseVoice模型的本地语音转文字工具
  • 【Linux我做主】探秘进程状态
  • 聚铭安全管家平台2.0实战解码 | 安服篇(三):配置保障 自动核查
  • 从单机架构到分布式:Redis为何成为架构升级的关键一环?
  • OpenLayers 综合案例-底图换肤(变色)
  • DevOps 详解
  • Linux -- 文件【中】
  • CVE-2022-46169漏洞复现
  • DNS污染与劫持
  • 《林景媚与命运协议》
  • 服务器数据恢复—RAID上层部署的oracle数据库数据恢复案例
  • logtrick 按位或最大的最小子数组长度
  • JavaWeb(苍穹外卖)--学习笔记15(分页查询PageHelper)
  • Unity_UI_NGUI_DrawCall
  • Mac安装Navicat步骤Navicat Premium for Mac v17.1.9【亲测】
  • 【腾讯云】EdgeOne网站安全防护的配置方法 防范盗刷流量 附恶意IP和UA黑名单
  • 学习网址备份(二)
  • Linux 启动流程、密码破解、引导修复完全手册
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • haproxy应用详解
  • 创建型设计模式-工厂方法模式和抽象工厂方法模式
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态