前言:对于跨域请求,很早之前就有去了解过,但因为一直关注的都是服务器后端开发,故也就仅仅停留在概念的理解上而没有机会在实际开发场景中接触得到。最近在公司的开发任务中,需要接触到 Ajax 跨域请求,由于之前没有遇到过类似的问题,在开发过程中遇到不少困难,也查阅了不少资料和博客。在这过程中收获了不少,故特意写下以下文章总结,如果文章有什么不足之处,还望各位指出。

什么是跨域请求

概述

​ 在 HTML 中,<a>, <form>, <img>, <script>, <iframe>, <link> 等标签以及 Ajax 都可以指向一个资源地址,而所谓的跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

​ 举个例子:假如一个域名为aaa.cn的网站,它发起一个资源路径为aaa.cn/books/getBookInfo的 Ajax 请求,那么这个请求是同域的,因为资源路径的协议、域名以及端口号与当前域一致(例子中协议名默认为http,端口号默认为80)。但是,如果发起一个资源路径为bbb.com/pay/purchase的 Ajax 请求,那么这个请求就是跨域请求,因为域不一致,与此同时由于安全问题,这种请求会受到同源策略限制。

跨域请求的安全问题

​ 通常,浏览器会对上面提到的跨域请求作出限制。浏览器之所以要对跨域请求作出限制,是出于安全方面的考虑,因为跨域请求有可能被不法分子利用来发动 CSRF攻击。

CSRF攻击:

​ CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。CSRF攻击者在用户已经登录目标网站之后,诱使用户访问一个攻击页面,利用目标网站对用户的信任,以用户身份在攻击页面对目标网站发起伪造用户操作的请求,达到攻击目的。

​ CSRF 攻击的原理大致描述如下:有两个网站,其中A网站是真实受信任的网站,而B网站是危险网站。在用户登陆了受信任的A网站是,本地会存储A网站相关的Cookie,并且浏览器也维护这一个Session会话。这时,如果用户在没有登出A网站的情况下访问危险网站B,那么危险网站B就可以模拟发出一个对A网站的请求(跨域请求)对A网站进行操作,而在A网站的角度来看是并不知道请求是由B网站发出来的(Session和Cookie均为A网站的),这时便成功发动一次CSRF 攻击。

​ 因而 CSRF 攻击可以简单理解为:攻击者盗用了你的身份,以你的名义发送而已请求。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。

​ 因此,大多数浏览器都会跨域请求作出限制,这是从浏览器层面上的对 CSRF 攻击的一种防御,但是需要注意的是在复杂的网络环境中借助浏览器来防御 CSRF 攻击并不足够,还需要从服务端或者客户端方面入手防御。详细可以参考这篇文章浅谈CSRF攻击方式

同源策略(Same-origin Policy)

概述

  • 同源策略是 Netscape 提出的一个著名的安全策略
  • 同源策略是浏览器最核心最基础的安全策略
  • 现在所有的可支持 Javascript 的浏览器都会使用这个策略
  • web构建在同源策略基础之上,浏览器对非同源脚本的限制措施是对同源策略的具体实现

同源策略的含义

  • DOM 层面的同源策略:限制了来自不同源的”Document”对象或 JS 脚本,对当前“document”对象的读取或设置某些属性
  • Cookie和XMLHttprequest层面的同源策略:禁止 Ajax 直接发起跨域HTTP请求(其实可以发送请求,结果被浏览器拦截,不展示),同时 Ajax 请求不能携带与本网站不同源的 Cookie。
  • 同源策略的非绝对性:<script><img><iframe><link><video><audio>等带有src属性的标签可以从不同的域加载和执行资源。
  • 其他插件的同源策略:flash、java applet、silverlight、googlegears等浏览器加载的第三方插件也有各自的同源策略,只是这些同源策略不属于浏览器原生的同源策略,如果有漏洞则可能被黑客利用,从而留下XSS攻击的后患

同源的具体含义

  • 域名、协议、端口有一个不同就不是同源,三者均相同,这两个网站才是同源

跨域解决方法

虽然在安全层面上同源限制是必要的,但有时同源策略会对我们的合理用途造成影响,为了避免开发的应用受到限制,有多种方式可以绕开同源策略,下面介绍的是经常使用的 JSONP, CORS 方法。

JSONP

原理:
  • JSONP 是一种非官方的跨域数据交互协议
  • JSONP 本质上是利用 <script><img><iframe> 等标签不受同源策略限制,可以从不同域加载并执行资源的特性,来实现数据跨域传输。
  • JSONP由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数,而数据就是传入回调函数中的JSON数据。
  • JSONP 的理念就是,与服务端约定好一个回调函数名,服务端接收到请求后,将返回一段 Javascript,在这段 Javascript 代码中调用了约定好的回调函数,并且将数据作为参数进行传递。当网页接收到这段 Javascript 代码后,就会执行这个回调函数,这时数据已经成功传输到客户端了。
示例:

首先当前页面中声明有这样的一个函数,它将作为 JSONP 的回调函数处理作为函数参数传入的数据

<script type="text/javascript">function dosomething(jsondata){//处理获得的json数据}
</script>

然后,我们就可以借助 <script><img><iframe> 等标签可以引入不同域资源的特性,将需要发送的请求的路径作为src参数,其中需要注意的是:需要告知服务端回调函数的函数名。

<script src="http://example.com/data.php?callback=dosomething"></script>

这时服务端在返回数据的时候,就会返回一端 Javascript 代码,在 Javascript代码中调用了回调函数,并且需要返回的数据作为回调函数的参数

dosomething(['a','b','c']);

最后页面成功加载了刚才指定路径的资源后,将会执行该 Javascript 代码,dosomething函数将执行,这时一次跨域请求完成。

另外,如果页面引入了 jQuery,那么可以通过它封装的方法很方便的实现JSONP操作了

// Using YQL and JSONP
$.ajax({url: "http://query.yahooapis.com/v1/public/yql",
<span class="token comment">// The name of the callback parameter, as specified by the YQL service</span>
jsonp<span class="token punctuation">:</span> <span class="token string">"callback"</span><span class="token punctuation">,</span><span class="token comment">// Tell jQuery we're expecting JSONP</span>
dataType<span class="token punctuation">:</span> <span class="token string">"jsonp"</span><span class="token punctuation">,</span><span class="token comment">// Tell YQL what we want and that we want JSON</span>
data<span class="token punctuation">:</span> <span class="token punctuation">{</span>q<span class="token punctuation">:</span> <span class="token string">"select title,abstract,url from search.news where query=\"cat\""</span><span class="token punctuation">,</span>format<span class="token punctuation">:</span> <span class="token string">"json"</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token comment">// Work with the response</span>
<span class="token function-variable function">success</span><span class="token punctuation">:</span> <span class="token keyword">function</span><span class="token punctuation">(</span> <span class="token parameter">response</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span>console<span class="token punctuation">.</span><span class="token function">log</span><span class="token punctuation">(</span> response <span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// server response</span>
<span class="token punctuation">}</span>

http://www.taodudu.cc/news/show-3625520.html

相关文章:

  • 什么是跨域?跨域详解
  • 什么是跨域问题?跨域问题怎么解决?
  • 什么是跨域及解决跨域都有哪些方法?
  • 什么是跨域以及为什么会出现跨域以及跨域的解决方案
  • 什么是跨域?什么情况下会发生跨域请求?
  • 什么是跨域、为什么要跨域、怎么解决跨域
  • 什么是跨域?如何解决?
  • 什么是跨域?
  • 什么是跨域,怎么解决跨域?
  • 【Java实习生面试题系列】-- JVM篇一
  • Java实习生面试题,大牛最佳总结
  • Java实习生面试题(一)
  • 首次面试JAVA实习生遇到的面试题
  • 商汤java实习生面试题
  • 2020 java实习生面试题总结
  • Java实习生面试题集锦
  • Java实习生面试总结
  • 校招java实习生面试试题
  • 大三暑假Java实习生面试题总结(郑州)
  • Java实习生面试题与笔试题
  • Java实习生面试题(二)
  • java后端实习生面试题
  • Java实习生面试题分享
  • 【Java实习生面试题系列】-- 多线程篇四
  • java实习生面试题_java实习生面试题大全(2019年整理)
  • Java实习生面试题整理
  • java实习生面试题_java实习生面试题.doc
  • java常见面试题(实习生篇)
  • 【OpenGL-矩阵】旋转矩阵推导
  • 旋转矩阵 推导

什么是跨域请求以及实现跨域的方案相关推荐

  1. laravel php跨域请求,laravel开发中跨域的解决方案

    前言 众所周知我们大家在用 laravel 进行开发的时候,特别是前后端完全分离的时候,由于前端项目运行在自己机器的指定端口(也可能是其他人的机器) , 例如 localhost:8000 , 而 l ...

  2. ajax跨域请求原理,Ajax跨域请求的原理(图文教程)

    这篇文章主要为大家详细介绍了Ajax跨域请求的原理,Ajax怎么样做跨域请求?具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了Ajax跨域请求的具体实现过程,供大家参考,具体内容 ...

  3. php跨域请求解决方案_swoft2 -跨域与中间件详解

    本方案用于开发环境,在生产环境不建议使用,生产环境可以使用 nginx 的反向代理 一.什么是跨域? 同源策略是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,浏览器很容易受到XSS ...

  4. vue-resource ajax跨域,ajax 跨域请求 vue-resource jsonp跨域

    aj体朋几一级发等点确层数框的很屏果行4带域ax 跨域请求 vue-resource j直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如数围请sonp跨域 最近在学习vue.js 碰到个ajax ...

  5. 跨域请求及解决跨域的方法

    目录 跨域 同源策略 如何解决跨域 JSONP 跨源资源共享(CORS) HTTP 响应首部字段 Access-Control-Allow-Origin Access-Control-Expose-H ...

  6. 前端跨域请求get_前端跨域请求jsonp实现

    第一步:编写被调用项目的controller. 1.需要集成springmvc,springboot项目集成web就包含springmvc,普通的servlet需要: PrintWriter w = ...

  7. Nginx配置跨域请求 Access-Control-Allow-Origin *

    Nginx配置跨域请求 Access-Control-Allow-Origin * 当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is p ...

  8. 浏览器同源策略以及跨域请求时可能遇到的问题

    跨域请求基础知识 浏览器的同源策略 浏览器的源指的是 协议://域名:端口 这样的URL组合.我们首先要明确几点 www.foo.com 和 foo.com 是不同域 www.foo.com 和 ww ...

  9. jsonp跨域原理_【网站技术解读①】Javascript实现跨域请求

    推荐一个读者做的不错的编程学习网站: 网站:潜安 域名:http://www.qianani.com 另外将会不定期推送近期网站用到的一些技术,讲一些核心原理,今天为第一篇 问题由来: 最近一直在优化 ...

最新文章

  1. php数据库滚动文字_PHP 里用的文字左右滚动?
  2. c语言循环程序设计教案,10 《C语言程序设计》教案 第三章 程序的控制结构(6)—循环结构 while和do while.doc...
  3. 【数字智能三篇】之一: 一页纸说清楚“什么是大数据”
  4. C:输入数字计数(数组方法)
  5. mysql数据库连接ado_mysql:2种连接数据库方式:ADO连接、mysql的API连接 | 学步园...
  6. 分部方法 partial
  7. linux查询.gz日志,linux2-查日志
  8. CentOS6.x系统挂载NTFS分区的移动硬盘
  9. 多段实例代码详解7大类Python运算符,建议收藏!
  10. 从0开始搭建公司后台技术栈,这套架构值得拥有...
  11. Python学习笔记之函数(二)
  12. Linux的三种权限含义,Linux chmod命令及权限含义
  13. ubuntu16.04开机只显示桌面背景鼠标解决方法
  14. android系统耗电如何关闭,安卓手机建议关闭这4大功能,耗电快的罪魁祸首?不用一天三充了...
  15. led设备驱动(s3c_led.c)
  16. websocket binary 数据解析_websocket协议
  17. maple 2022
  18. 使用纯JavaScript实现全网页动态樱花飘落特效
  19. 空间直线与球面的相交算法
  20. 女子人身安全防卫指南

热门文章

  1. 手机赚钱软件整套出售,类似赚钱宝、米赚、学生赚
  2. C++中创建二维数组的四种方法
  3. harris算法 matlab,Harris算法的Matlab代码
  4. windons下远程提交任务到linux上的spark集群
  5. Altium Designer 22 中文字符乱码
  6. iomanip在c语言中用什么代替,关于#include iomanip中iomanip的作用~
  7. Uncaught SyntaxError: Unexpected token ‘<‘ (at chunk-vendors.js:1:1) app.js:1 Uncaught SyntaxError:
  8. 如何缓解学习过程中头晕、头胀
  9. 网展中英外贸网站绿色风格 v10.3
  10. 安徽大学计算机学院毕业照,安徽大学毕业生的毕业照创意十足