首页
学习
活动
专区
圈层
工具
发布
16 篇文章
1
Go 语言 Web 编程系列(一)—— 快速入门:创建第一个 Web 应用
2
Go 语言 Web 编程系列(二)—— HTTP 请求处理的底层运行机制
3
Go 语言 Web 编程系列(三)—— 基于官方标准库自定义路由处理器
4
Go 语言 Web 编程系列(四)—— 基于 gorilla/mux 包实现路由定义:基本使用篇
5
Go 语言 Web 编程系列(五)—— 基于 gorilla/mux 包实现路由匹配:进阶使用篇
6
Go 语言 Web 编程系列(六)—— 基于 gorilla/mux 包实现路由匹配:路由中间件
7
Go 语言 Web 编程系列(七)—— 基于 gorilla/mux 包实现路由匹配:处理静态资源响应
8
Go 语言 Web 编程系列(八)—— 基于 gorilla/mux 包实现路由匹配:服务 SPA 应用
9
Go 语言 Web 编程系列(九)—— 基于 gorilla/mux 包实现路由匹配:通过 CORS 处理跨域请求
10
Go 语言 Web 编程系列(十)—— 基于 gorilla/mux 包实现路由匹配:健康检查与接口测试
11
Go 语言 Web 编程系列(十一)—— 仿照 Laravel 框架对 Go 路由代码进行拆分
12
Go 语言 Web 编程系列(十二)—— 通过 Request 读取 HTTP 请求报文
13
Go 语言 Web 编程系列(十三)—— 获取用户请求数据(上)
14
Go 语言 Web 编程系列(十四)—— 获取用户请求数据(下)
15
Go 语言 Web 编程系列(十五)—— 通过 ResponseWriter 接口创建 HTTP 响应
16
Go 语言 Web 编程系列(十六)—— 设置、读取和删除 Cookie

Go 语言 Web 编程系列(九)—— 基于 gorilla/mux 包实现路由匹配:通过 CORS 处理跨域请求

在 SPA 应用或者其他前后端分离应用中,如果前后端域名不一致,则可能涉及到跨域请求问题。

关于跨域请求和 CORS 学院君之前在 Laravel CORS 扩展包使用教程 中曾简单介绍过,不了解的可以去看下,这里不再重复讲了,Go 语言这边的原理和那里一致,在基于 gorilla/mux 实现的路由器中,为了通过 CORS 处理跨域请求,可以这么做:

  • 在自己的 CORS 处理器中设置 CORS 相关头,比如 Access-Control-Allow-Origin
  • 通过 CORSMethodMiddleware 这个中间件来设置 Access-Control-Allow-Methods 响应头定义路由允许的 HTTP 请求方法

⚠️ 为了让中间件设置响应头,必须在请求方法匹配器中包含 OPTIONS 方法。

下面我们来看一个简单的示例:

代码语言:javascript
复制
package main

import (
    "net/http"
    "github.com/gorilla/mux"
)

func main() {
    r := mux.NewRouter()

    // 注意: 为了让中间件可以设置 CORS 头在 Methods 方法中必须包含 OPTIONS 方法
    r.HandleFunc("/api/cors", corsHandler).Methods(http.MethodGet, http.MethodPut, http.MethodOptions)
    // CORSMethodMiddleware 中间件会将上一步设置的方法设置到 Access-Control-Allow-Methods 响应头
    r.Use(mux.CORSMethodMiddleware(r))

    http.ListenAndServe(":8080", r)
}

func corsHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Access-Control-Allow-Origin", "*")
    if r.Method == http.MethodOptions {
        return
    }

    w.Write([]byte("Cors Request"))
}

运行这段代码启动服务器,然后通过如下命令对 /api/cors 路由发起请求:

代码语言:javascript
复制
代码语言:javascript
复制
curl -v http://localhost:8080/api/cors

使用 -v 选项可以看到请求头和响应头信息,结果如下:

可以看到响应头中包含了 Access-Control-Allow-MethodsAccess-Control-Allow-Origin 响应头,分别表示跨域请求支持的方法和域名,如果前端域名是 fontend.xueyuanjun.com,后端域名是 backend.xueyuanjun.com,那么现在它们之间可以基于 Ajax 请求进行通信了。

下一篇
举报
领券