go语言由于前端跨域导致无法访问到后端办理方案

[复制链接]
发表于 2025-10-20 18:19:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前端服务8080访问后端8081这端口体现跨域了
ERROR Network Error AxiosError: Network Error at XMLHttpRequest.handleError (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:116:14) at Axios.request (webpack-internal:///./node_modules/axios/lib/core/Axios.js:58:41) at async getCurrentUser (webpack-internal:///./src/api/user.ts:50:10) at async Proxy.fetchLoginUser (webpack-internal:///./src/store/useLoginUserStore.ts:17:17)
跨域标题通常是由于欣赏器的同源战略导致的。必要在 Gin 服务器中启用 CORS(跨域资源共享)。Gin 提供了一个中心件 gin-contrib/cors 来方便地处理惩罚 CORS 哀求。
启用 CORS 的步调:
安装gin-contrib/cors中心件:
可以使用 go get 下令来安装这个中心件。
  1. go get github.com/gin-contrib/cors
复制代码
  1. package app
  2. import (
  3.         "fmt"
  4.         "github.com/gin-contrib/cors"
  5.         "github.com/gin-gonic/gin"
  6.         "log"
  7.         "net/http"
  8.         "time"
  9. )
  10. func HttpServer() {
  11.         ginServer := gin.Default()
  12.         // 配置 CORS 中间件
  13.         config := cors.DefaultConfig()
  14.         config.AllowOrigins = []string{"http://localhost:8080"}                                     // 允许8080来源的请求,生产环境中建议指定具体的域名
  15.         config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}                   // 允许的请求方法
  16.         config.AllowHeaders = []string{"Origin", "Content-Length", "Content-Type", "Authorization"} //  允许的请求头
  17.         config.ExposeHeaders = []string{"Content-Length"}                                           // 允许的响应头
  18.         config.AllowCredentials = true                                                              // 允许携带凭证
  19.         config.MaxAge = 12 * time.Hour                                                              // 预检请求缓存时间
  20.         ginServer.Use(cors.New(config)) // 使用 CORS 中间件
  21.         // 注册路由和处理函数
  22.         ginServer.POST("/api/backup", backupHandler)
  23.         ginServer.POST("/api/user/register", userRegisterHandler)
  24.         ginServer.POST("/api/user/login", userLoginHandler)
  25.         ginServer.POST("/api/user/logout", userLogoutHandler)
  26.         ginServer.GET("/api/user/current", getCurrentUserHandler)
  27.         ginServer.GET("/api/user/search", searchUserHandler)
  28.         ginServer.POST("/api/user/delete", deleteUserHandler)
  29.         if err := ginServer.Run(":8081"); err != nil {
  30.                 log.Fatalf("HTTP server failed to start: %v", err)
  31.         }
  32. }
  33. // 备份处理函数
  34. func backupHandler(context *gin.Context) {
  35.         var login struct {
  36.                 Username string `json:"username"`
  37.                 Password string `json:"password"`
  38.         }
  39.         if err := context.ShouldBindJSON(&login); err != nil {
  40.                 context.JSON(http.StatusBadRequest, gin.H{
  41.                         "code": http.StatusBadRequest,
  42.                         "msg":  "invalid request",
  43.                 })
  44.                 return
  45.         }
  46.         if login.Username == "admin" && login.Password == "123456" {
  47.                 context.JSON(http.StatusOK, gin.H{
  48.                         "code": http.StatusOK,
  49.                         "msg":  "success",
  50.                 })
  51.                 fmt.Println("成功执行这个代码")
  52.         } else {
  53.                 context.JSON(http.StatusUnauthorized, gin.H{
  54.                         "code": http.StatusUnauthorized,
  55.                         "msg":  "invalid credentials",
  56.                 })
  57.         }
  58. }
  59. // 用户注册处理函数
  60. func userRegisterHandler(context *gin.Context) {
  61.         var user struct {
  62.                 Username string `json:"username"`
  63.                 Password string `json:"password"`
  64.         }
  65.         if err := context.ShouldBindJSON(&user); err != nil {
  66.                 context.JSON(http.StatusBadRequest, gin.H{
  67.                         "code": http.StatusBadRequest,
  68.                         "msg":  "invalid request",
  69.                 })
  70.                 return
  71.         }
  72.         // 检查用户名是否已存在
  73.         // 这里可以添加数据库操作或其他逻辑
  74.         if user.Username == "admin" {
  75.                 context.JSON(http.StatusConflict, gin.H{
  76.                         "code": http.StatusConflict,
  77.                         "msg":  "username already exists",
  78.                 })
  79.                 return
  80.         }
  81.         // 添加新用户
  82.         // 这里可以添加数据库操作或其他逻辑
  83.         fmt.Println("User registered:", user.Username)
  84.         context.JSON(http.StatusOK, gin.H{
  85.                 "code": http.StatusOK,
  86.                 "msg":  "user registered successfully",
  87.         })
  88. }
  89. // 用户登录处理函数
  90. func userLoginHandler(context *gin.Context) {
  91.         var user struct {
  92.                 Username string `json:"username"`
  93.                 Password string `json:"password"`
  94.         }
  95.         if err := context.ShouldBindJSON(&user); err != nil {
  96.                 context.JSON(http.StatusBadRequest, gin.H{
  97.                         "code": http.StatusBadRequest,
  98.                         "msg":  "invalid request",
  99.                 })
  100.                 return
  101.         }
  102.         // 验证用户名和密码
  103.         // 这里可以添加数据库操作或其他逻辑
  104.         if user.Username == "admin" && user.Password == "123456" {
  105.                 context.JSON(http.StatusOK, gin.H{
  106.                         "code": http.StatusOK,
  107.                         "msg":  "login successful",
  108.                 })
  109.                 return
  110.         }
  111.         context.JSON(http.StatusUnauthorized, gin.H{
  112.                 "code": http.StatusUnauthorized,
  113.                 "msg":  "invalid credentials",
  114.         })
  115. }
  116. // 用户登出处理函数
  117. func userLogoutHandler(context *gin.Context) {
  118.         // 这里可以添加登出逻辑,例如清除会话等
  119.         context.JSON(http.StatusOK, gin.H{
  120.                 "code": http.StatusOK,
  121.                 "msg":  "logout successful",
  122.         })
  123. }
  124. // 获取当前用户信息处理函数
  125. func getCurrentUserHandler(context *gin.Context) {
  126.         // 这里可以添加获取当前用户逻辑,例如从会话中获取用户信息
  127.         user := struct {
  128.                 Username string `json:"username"`
  129.         }{Username: "admin"} // 示例用户
  130.         context.JSON(http.StatusOK, gin.H{
  131.                 "code": http.StatusOK,
  132.                 "msg":  "success",
  133.                 "user": user,
  134.         })
  135. }
  136. // 获取用户列表处理函数
  137. func searchUserHandler(context *gin.Context) {
  138.         username := context.Query("username")
  139.         user := struct {
  140.                 Username string `json:"username"`
  141.         }{Username: username} // 示例用户
  142.         context.JSON(http.StatusOK, gin.H{
  143.                 "code": http.StatusOK,
  144.                 "msg":  "success",
  145.                 "user": user,
  146.         })
  147. }
  148. // 删除用户处理函数
  149. func deleteUserHandler(context *gin.Context) {
  150.         var id string
  151.         if err := context.ShouldBindJSON(&id); err != nil {
  152.                 context.JSON(http.StatusBadRequest, gin.H{
  153.                         "code": http.StatusBadRequest,
  154.                         "msg":  "invalid request",
  155.                 })
  156.                 return
  157.         }
  158.         // 删除用户逻辑
  159.         // 这里可以添加数据库操作或其他逻辑
  160.         fmt.Println("User deleted:", id)
  161.         context.JSON(http.StatusOK, gin.H{
  162.                 "code": http.StatusOK,
  163.                 "msg":  "user deleted successfully",
  164.         })
  165. }
复制代码
分析


  • 安装 gin-contrib/cors:使用 go get github.com/gin-contrib/cors
    安装中心件。
  • 设置 CORS 中心件:在 HttpServer 函数中使用 cors.DefaultConfig() 设置 CORS 设置,并将其应用到 Gin 服务器
  • 答应的泉源:config.AllowOrigins = []string{"*"} 答应全部泉源的哀求。在生产环境中,发起指定详细的域名以进步安全性。
  • 答应的方法:config.AllowMethods 指定答应的 HTTP 方法。
  • 答应的头部:config.AllowHeaders 指定答应的哀求头部。
  • 袒露的头部:config.ExposeHeaders 指定答应袒露的相应头部。
  • 答应根据:config.AllowCredentials 答应发送根据(如 cookies)。
  • 最大缓存时间:config.MaxAge 设置预检哀求的最大缓存时间。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表