网络编程-跨域资源共享 CORS
1.什么是同源策略?
如果两个 URL 的 protocol、port 和 host 都相同的话,则这两个 URL 是同源。同源策略对Web应用程序具有特殊意义,因为Web应用程序广泛依赖于HTTP cookie来维持用户会话,所以必须将不相关网站严格分隔,以防止丢失数据泄露。
值得注意的是同源策略仅适用于脚本,这意味着某网站可以通过相应的HTML标签访问不同来源网站上的图像、CSS和动态加载脚本等资源。而跨站请求伪造就是利用同源策略不适用于HTML标签的缺陷。
2.跨域资源共享 CORS
跨域资源共享(英语:Cross-origin resource sharing,缩写:CORS),用于让网页的受限资源能够被其他域名的页面访问的一种机制。
通过该机制,页面能够自由地使用不同源(英语:cross-origin)的图片、样式、脚本、iframes以及视频。一些跨域的请求(特别是Ajax)常常会被同源策略所禁止的。跨源资源共享定义了一种方式,为的是浏览器和服务器之间能互相确认是否足够安全以至于能使用跨源请求。比起纯粹的同源请求,这将更为自由和功能性的(functionality ),但比纯粹的跨源请求更为安全。
3.预检请求
需预检的请求要求必须首先使用 OPTIONS 方法发起一个预检请求到服务器,以获知服务器是否允许该实际请求。"预检请求“的使用,可以避免跨域请求对服务器的用户数据产生未预期的影响。
不会触发CORS预检的请求称为简单请求,满足以下所有条件的才会被视为简单请求
1)使用GET、POST、HEAD其中一种方法
2)只使用了如下的安全首部字段,不得人为设置其他首部字段
- Accept
- Accept-Language
- Content-Language
- Content-Type 只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
4.CORS相关字段
- Access-Control-Allow-Origin:该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。
- Access-Control-Allow-Headers:表明服务器允许请求中携带的头信息字段。值为逗号分割的列表。
- Access-Control-Allow-Credentials:该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。
- Access-Control-Allow-Methods:该字段必需,用于预检请求的响应。其指明了实际请求所允许使用的 HTTP 方法。
- Access-Control-Max-Age:该字段可选,用来指定本次预检请求的有效期,单位为秒。在此期间,不用发出另一条预检请求。
5.Golang实现跨域
客户端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>XMLHttpRequest CORS</title>
</head>
<body>
<h2>XMLHttpRequest CORS</h2>
<button id="send">发送POST(application/x-www-form-urlencoded)</button>
<button id="sendJSON">发送POST(application/json)</button>
<script type="application/javascript">
document.getElementById('send').onclick = function (evt) {
let xhr = new XMLHttpRequest();
xhr.open("POST", "http://127.0.0.1:8080/index", true)
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
xhr.setRequestHeader("x-Custome-Header", "true")
let params = new URLSearchParams()
params.append("name", "dazuo")
params.append("age", "24")
xhr.send(params)
}
document.getElementById('sendJSON').onclick = function (evt) {
let xhr = new XMLHttpRequest();
xhr.open("POST", "http://127.0.0.1:8080/index", true)
xhr.setRequestHeader("Content-Type", "application/json")
xhr.setRequestHeader("x-Custome-Header", "true")
let postData = JSON.stringify({
name: "dazuo",
age: 24
})
xhr.send(postData)
}
</script>
</body>
</html>
服务端
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func HTTPCORS() {
http.HandleFunc("/index", func(w http.ResponseWriter, r *http.Request) {
header := w.Header()
header.Set("Access-Control-Allow-Origin", "*")
header.Set("Access-Control-Allow-Headers", "x-Custome-Header,Content-Type")
header.Set("Access-Control-Allow-Credentials", "false")
header.Set("Access-Control-Allow-Methods", "POST,GET,DELETE,PUT,OPTIONS")
header.Set("Access-Control-Max-Age", "5")
if r.Method == "OPTIONS" {
w.WriteHeader(http.StatusNoContent)
}
reqBody, _ := ioutil.ReadAll(r.Body)
fmt.Printf("RequestURI: %s, Methods: %s, ReqBody: %s\n", r.RequestURI, r.Method, reqBody)
_, _ = w.Write([]byte("welcome !"))
})
err := http.ListenAndServe("127.0.0.1:8080", nil)
if err != nil {
log.Panic(err)
}
}
6.参考资料
网络编程-跨域资源共享 CORS的更多相关文章
- 跨域资源共享CORS与JSONP
同源策略限制: 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果没有同源策略,攻击者可以通过JavaScript获取你的邮件以及其他敏感信息,比如说 ...
- VUE SpringCloud 跨域资源共享 CORS 详解
VUE SpringCloud 跨域资源共享 CORS 详解 作者: 张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...
- 跨域资源共享(CORS)问题解决方案
CORS:Cross-Origin Resource Sharing(跨域资源共享) CORS被浏览器支持的版本情况如下:Chrome 3+.IE 8+.Firefox 3.5+.Opera 12+. ...
- 跨域解决方案 - 跨域资源共享cors
目录 1. cors 介绍 2. 原理 3. cors 解决跨域 4. 自定义HTTP 头部字段解决跨域 5. 代码演示 5. 参考链接 1. cors 介绍 cors 说的是一个机制,其实相当于一个 ...
- 【转】跨域资源共享 CORS 详解
本文来源:http://www.ruanyifeng.com/blog/2016/04/cors.html 阮一峰老师的网络日志 CORS是一个W3C标准,全称是"跨域资源共享"( ...
- 跨域资源共享 CORS
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...
- 跨域资源共享 CORS 详解
CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请求,从 ...
- 使Web Api 支持跨域资源共享(CORS)
Reference:http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api Imp ...
- 跨域资源共享CORS详解
简介 CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing). 它允许浏览器向跨源服务器,发出XMLHttpRequest请 ...
随机推荐
- LuoguP2378 因式分解II 题解
Content 输入一个多项式 \(x^2+ax+b\)(不保证 \(a,b\neq0\)),请对这个多项式进行因式分解(形式为 \((x-x_1)(x-x_2)\),其中 \(x_1>x_2\ ...
- 如何获取网管MTU
在本机打开dos窗口,执行: ping -f -l 1472 192.168.0.1 其中192.168.0.1是网关IP地址,1472是数据包的长度.请注意,上面的参数是"-l" ...
- Linux(Centos)内存占用过高处理
查看内存占用最大 ps aux| grep -v "USER" |sort -n -r -k 4 |awk 'NR==1{ print $0}' 命令查看占用内存最大的10个进程 ...
- 页面调用百度地图但是使用了https证书之后不显示
首先百度地图使用的都是http请求链接,但是安装了证书之后会觉得这个http不安全,所以默认请求失败 这时候我们在请求头添加 <meta http-equiv="Content-Sec ...
- c++代码编译错误查找方法之宏
1.关于 本文演示环境: win10+vs2017 好久不用这法子了,都快忘了 排查错误,思路很重要,且一定要思路清晰(由于自己思路不清晰,查找错误耽误了不少时间,其实问题很简单,只是你要找到他需要不 ...
- 【LeetCode】190. Reverse Bits 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 二进制字符串翻转 位运算 日期 题目地址:https://le ...
- sql-labs 1-14
less-1: 1.采用二分法进行猜列: http://192.236.147.191:30000/Less-1/?id=1' order by 10--+ Welcome Dhakkan Un ...
- [git]git重连
使用以下两个命令清理缓存进行ssh清除:$ssh-keygen -f "/home/leoxae/.ssh/known_hosts" -Rxxx.xxx.xxx.xxx(指定IP) ...
- 【jvm】03-写了final就是常量池了么
[jvm]03-写了final就是常量池了么 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点 ...
- 编写Java程序,实现多线程操作同一个实例变量的操作会引发多线程并发的安全问题。
查看本章节 查看作业目录 需求说明: 多线程操作同一个实例变量的操作会引发多线程并发的安全问题.现有 3 个线程代表 3 只猴子,对类中的一个整型变量 count(代表花的总数,共 20 朵花)进行操 ...