跨域处理
记录为什么会发生跨域,以及处理跨域的一些办法。
# 为什么会跨域?
跨域的产生来源于现代浏览器所通用的‘同源策略’,所谓同源策略,是指只有在地址的:协议名,地址名,端口一样的时候,才允许访问相同的cookie、localStorage或是发送Ajax请求等等。若在不同源的情况下访问,就称为跨域。
# 为什么浏览器会禁止跨域
跨域的访问会带来许多安全性的问题,比如,cookie一般用于状态控制,常用于存储登录的信息,如果允许跨域访问,那么别的网站只需要一段脚本就可以获取你的cookie,从而冒充你的身份去登录网站,造成非常大的安全问题,因此,现代浏览器均推行同源策略。
# 简单描述
- 浏览器限制
- 域名,端口不一样
- XHR(XMLHttpRequest请求)
满足以上三个条件即会跨域
# 简单请求和非简单请求:
# 常见简单请求
- 方法为get,head,post, 请求header里面没有自定义头,
- Content-Type的值为以下几种 text/plain,multipart/form-data,application/x-www-form-urlencoded。
# 常见非简单请求
- put,delect 方法的ajax请求
- 发送json格式的ajax请求
- 带自定义头的ajax请求。
# 解决跨域方案:
- 从浏览器出发,允许浏览器跨域
- 从XHR(XMLHttpRequest)出发
- 避免发生跨域:
- 使用jsonp
- 产生跨域后解决。
- 服务器实现
- ngin配置
# 解决跨域
# 使用jsonp
原因是:jsonp请求是通过script的方式发送,且只有xhr的请求方式才有可能产生跨域问题。
服务端允许跨域,响应头中添加:
- Access-Control-Allow-Origin=“允许跨域的url”,即跨省域时,请求头Origin的值,所以一般是获取Origin的值。
- Access-Control-Allow-Method=“*”,允许的方法。非简单请求处理方案:在相应头中添加
- Access-Control-Request-Headers=“Content-Type,自定义的header的key”。
- Access-Control-Allow-Credentials,="true",带cookies的跨域解决 允许使用cookies
# nginx配置
上次更新: 2024/11/05, 08:29:31