当前位置: 首页 > ds >正文

同源策略--跨域

为啥会出现跨域 

我们发送的请求通常包含这三部分:协议+域名+端口。如果浏览器发送的ajax请求和当前界面的url的这三部分全部相同即为同源,反之不同源。
如果没有同源策略,假设用户登陆网站a后又去访问b网站,那么b网站就可以窃取用户在网站a的cookie进而冒充用户。

注意,我们常说的同源策略是针浏览器针对ajax的限制!!ajax请求可以到达服务器并响应,但是浏览器会对响应进行校验,非同源则跨域。

跨域解决几种解决方案

CORS(corss origin resource sharing)

CORS(跨域资源共享),是一种基于HTTP头的机制,该机制需要浏览器和服务器同时支持,

对于前端而言不需要做任何操作,浏览器在发送请求时会自动带上cors请求头,我们只需要在服务器的响应头进行设置即可,只要HTTP响应头中包含相应的CORS响应头即可。
CORS机制在老版本的浏览器中不支持,现代浏览器都支持CORS。在使用CORS发送AJAX请求时浏览器端代码和过去一致,服务器端仅需要配置CORS的响应头。

服务器需要设置的响应头如下: 

对于复杂请求,在正式请求发送前会有一个预检请求OPTIONS来询问服务器,是否允许跨域请求,请求头包含这些东西:

    OPTIONS /cors HTTP/1.1
Origin: http://localhost:8888 请求来源
Access-Control-Request-Method: GET 请求方法
Access-Control-Request-Headers: X-Custom-Header 额外的头信息

因为我们服务器的响应头已经配置了哪些请求方法、哪些请求源可以跨域,浏览器会首先检查服务器对预检请求的响应,如果响应中包含了允许跨域的 CORS 响应头,浏览器会继续发送实际的请求。

复杂请求和简单请求

简单请求

  • 请求方法:GET、POST、HEAD
  • HTTP的头信息不超出以下几种字段:Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain

复杂请求

  • 请求方法:put、delete

一般认为axios是复杂请求,因为axios默认会添加一些自定义头部,尤其是在处理 POST 请求时。以下是几个常见的例子:

  • Content-Type:默认情况下,Axios 会将 Content-Type 设置为 application/json,这是一个常见的自定义请求头。当你发送 JSON 数据时,浏览器会认为这个请求是复杂请求,需要发送预检请求。

  • Authorization:如果请求中包含了 Authorization 头,这会使请求变得复杂,浏览器会触发预检请求。

  • 跨域请求时的凭证:如果请求设置了 withCredentials: true(允许跨域请求携带 cookie 或其他凭证信息),也可能导致浏览器将请求视为复杂请求。

服务器代理

前端Nginx代理

JSONP

Jsonp是最早的跨域解决方案,利用script标签可以跨域的原理实现
缺点是只能发起GET请求
原理:
Jsonp其实就是一个跨域解决方案。跨域请求数据是不可以的,但是跨域请求js脚本是可以的。可以把数据封装成一个js语句,做一个方法的调用。跨域请求js脚本可以得到此脚本。得到js脚本之后会立即执行。可以把数据做为参数传递到方法中。就可以获得数据。从而解决跨域问题。
比如用<script>标签链接了一个callback函数,服务器返回JSON数据并把数据作为函数的参数传递进去,页面执行callback函数将数据作为参数来处理

<script type="text/javascript">function callback(data){// other code here}var myScript = document.createElement("script");myScript.src = "http://www.server.com/data.json?jsonp=callback";document.body.appendChild(myScript);
</script>
http://www.xdnf.cn/news/19740.html

相关文章:

  • 盟接之桥说制造:浅谈本分和做正确的事情
  • HBase实战(一)
  • MFC应用防止多开
  • OpenCV 4.1.1 编译错误解决方案(cudaoptflow.hpp not found)
  • Day20 API
  • 数据血缘中的图数据库如何选择
  • Qt UDP 网络编程详解
  • 【学Python自动化】5.1 Python 与 Rust 数据结构对比学习笔记
  • (Arxiv-2025)VACE:一体化视频创作与编辑
  • (纯新手教学)计算机视觉(opencv)实战十一——轮廓近似(cv2.approxPolyDP)
  • C++实时视频抽帧抓图功能(附源码)
  • 几种特殊的数字滤波器---原理及设计
  • 基于springboot生鲜交易系统源码和论文
  • Beego: Go Web Framework 详细指南
  • Eclipse使用教程_自用
  • vite基础讲解
  • 【C++】C++14新特性
  • Jenkins大总结 20250901
  • Abaqus后处理常见问题汇总
  • python生成器与协程深度剖析
  • 腾讯位置商业授权微信小程序获取城市列表
  • 数据分析编程第八步:文本处理
  • flex布局order改变排列顺序
  • 前沿科技竞速:脑机接口、AI芯片与半导体生态上的新突破
  • Product Hunt 每日热榜 | 2025-08-31
  • 记录我的第一次挖洞
  • 蓝牙BLE modem调制里面phase manipulation什么意思
  • Proteus8 仿真教学全指南:从入门到实战的电子开发利器
  • 【数据可视化-103】蜜雪冰城门店分布大揭秘:2025年8月数据分析及可视化
  • Dify之插件开发之Crawl4ai 爬虫打包与发布