跨域,简称CROS,Cross-origin resource sharing。这里不仅仅是golang开发http server时会遇到的问题,它不区分语言,只要是http server都可能遇到这个问题。
本文介绍跨域的通用解决办法。

一个简单的golang http server

使用golang开发一个简单的http server程序,程序应答hello, world。如下逻辑所示:

package mainimport "net/http"func HandlerHttp(w http.ResponseWriter, r *http.Request) {w.Write([]byte("hello, world"))
}func main() {http.HandleFunc("/", HandlerHttp)http.ListenAndServe("127.0.0.1:8888", nil)
}

程序启动后在浏览器中输入http://127.0.0.1:8888,正常输出hello, world


跨域访问问题

跨域访问是指当请求地址与http服务器地址或端口不一致时,且请求为XMLHttpRequest请求,也就是ajax访问。

跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的阻止跨站攻击。因此,跨域问题 是针对ajax的一种限制。

我们在访问某个网页的浏览器窗口上,进入浏览器开发者模式下,执行一个XMLHttpRequest请求

req = new XMLHttpRequest()
req.open('get', 'http://127.0.0.1:8888', true)
req.send()

执行后会报错:已拦截跨源请求:同源策略禁止读取位于 http://127.0.0.1:8888/ 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。状态码:200。

服务端解决办法

在服务端中http响应头中设置Access-Control-Allow-Origin允许跨域访问域名信息。对应与本例中http server,则只需要在HandlerHttp函数中设置对应的响应头。

为了更通用,还需要处理OPTIONS类型http请求,所以通用的一个处理方式如下所示:

package mainimport "net/http"func setupCORS(w *http.ResponseWriter) {(*w).Header().Set("Access-Control-Allow-Origin", "*")(*w).Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")(*w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}func HandlerHttp(w http.ResponseWriter, r *http.Request) {setupCORS(&w)if r.Method == "OPTIONS" {return}w.Write([]byte("hello, world"))
}func main() {http.HandleFunc("/", HandlerHttp)http.ListenAndServe("127.0.0.1:8888", nil)
}

修改后,使用XMLHttpRequest方式访问网页正常返回结果。


参考资料

  1. https://stackoverflow.com/questions/39507065/enable-cors-in-golang
  2. https://flaviocopes.com/golang-enable-cors/

Golang http server 跨域问题与解决办法相关推荐

  1. 前端面试查漏补缺--(三) 跨域及常见解决办法

    前言 本系列最开始是为了自己面试准备的.后来发现整理越来越多,差不多有十二万字符,最后决定还是分享出来给大家. 为了分享整理出来,花费了自己大量的时间,起码是只自己用的三倍时间.如果喜欢的话,欢迎收藏 ...

  2. JavaScript跨域总结与解决办法

    JavaScript跨域总结与解决办法 什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window ...

  3. js的跨域问题和解决办法

    js的跨域问题和解决办法 参考文章: (1)js的跨域问题和解决办法 (2)https://www.cnblogs.com/jsrou/p/9896451.html 备忘一下.

  4. vue : 本地调试跨域问题的解决办法:proxyTable

    vue : 本地调试跨域问题的解决办法:proxyTable 参考文章: (1)vue : 本地调试跨域问题的解决办法:proxyTable (2)https://www.cnblogs.com/fo ...

  5. Google谷歌浏览器Post请求预见strict-origin-when-cross-origin跨域问题的 解决办法

    问题概述 关于这个问题,后端接口开发完成,前端功能界面和函数方法体编写完成后,博主在前后端联调的时候遇到的,接口是调用成功了,但是没有返回任何结果, 错误信息:" Referrer Poli ...

  6. JavaScript跨域总结与解决办法(转)

    什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用H ...

  7. axios代理跨域 cli4_跨域本质及解决办法

    1.什么是跨域? 2.如何解决? 跨域是前端所独有的,后端不存在跨域问题.是浏览器的一种安全保护手段,为了防止别人抓取.篡改你的网站数据信息.遵循同源策略.同协议(http).同域名.同端口,少一项不 ...

  8. 关于跨域问题的解决办法

    跨域是指 在不同的域之间进行数据传输,只要协议.域名.端口有任何一个不同,都被当作是不同的域. 解决跨域的方法: 1.JSONP: 利用script的src 可以在不同域之间请求数据的特点,向某一地址 ...

  9. 微信公众号网页版,获取用户code时出现跨域问题的解决办法之一

    前提是微信公众号后台设置没有问题. 网页授权域名不要设置有问题 根据微信[官方文档] 第一步:用户同意授权,获取code 在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高 ...

最新文章

  1. php和python哪个好-PHP和Python语言选择哪个好
  2. tensorlfow.saved_model的使用
  3. ORACLE利用STANDBY端RMAN备份进行数据恢复
  4. 保护公民信息安全 中国在行动
  5. MySQL从查找数据库表到删除全过程
  6. Spring Security 学习之X.509认证
  7. Flash MX 认证考试(样题)
  8. 超简单,自己动手写一个二维码生成器
  9. bat脚本_获取管理员权限
  10. android4.0root,最强大一键ROOT 轻松搞定安卓4.0
  11. Feescale K64开发笔记1: 开发环境的建立
  12. 计算机函数sumifs应用题型难,在SUMIFS函数语句中使用Vlookup时遇到问题
  13. 删除电脑中删不掉的文件或文件夹
  14. ISO 8601时间格式时间创建
  15. 6 生僻字_《生僻字》歌词拼音与注释,跟着音乐学汉字
  16. 解析信号与Matlab hilbert函数
  17. zookeeper随堂笔记
  18. webpack4 搭建 Vue 开发环境笔记
  19. 为什么房子要坐南朝北,用地理的知识解释一下
  20. 28人买可乐喝,3个可乐瓶盖可以换一瓶可乐,那么要买多少瓶可乐

热门文章

  1. 小技巧-彻底删除U盘中的文件
  2. 竞品分析(淘宝、京东)
  3. 10Mbps以太网的帧长度
  4. 【jquery】Chosen.jquery.js 插件动态加载数据问题
  5. 环保数采仪下的污染物PM2.5在线监测方案
  6. python用while做九九乘法表_Python 语法控制(含用while和for实现九九乘法表)
  7. 医疗——医院信息管理系统
  8. Windows电脑中设置网络优先级的设置方法
  9. 字体图标库(Font Awesome)的使用--绝佳的图标字体库和CSS框架
  10. MFC 按钮控件添加图片