前端培训-中级阶段(11,12)-跨域请求原理以及实现

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。JSONP 跨域请求原理以及实现方式jQuery封装的Ajax调用和JSONP数据跨域请求原理和实现上节我们讲了同源策略,这节我们讲讲如何跨域。这东西就和产品提需求一样,我知道不合理,但是我就想要。

跨域分类


  1. iframe 跨域比如www.51vv.com的一部分(header吧),我k.51vv.com也想用。默认情况下不同源,是不允许的。那我们怎么办呢?


bVbvhY6.webp.jpg


  1. domain
  2. postMessage


2.ajax 跨域

  1. JSONP
  2. CORS
  3. 服务器代理


3.canvas 资源跨域

  1. image 跨域


4.script 资源跨域

  1. Script error.


为了提升网站的访问速度,我们通常都会将静态资源文件(css, image, javascript)放在CDN。当这些从CDN的JavaScript脚本执行出错,因为违背了同源策略, 为了保证用户信息不被泄露,错误信息不会显示出来,取而代之只会返回一个Script error.。


ajax 跨域方案


这部分知识是我们开发中经常会遇到的。下面我们来介绍一下常见的几种方法。


JSONP 跨域方案


JSONP 优缺点


  1. 优点


  1. 浏览器兼容性强(全支持)


  1. 缺点


  1. 不安全(嵌入异常逻辑代码)
  2. 只能发GET请求


JSONP 原理


下面我们来说一下JSONP的原理,顺便分析一下上面的优缺点。


  1. 首先 script 标签引入的代码,不管跨不跨域都可以执行。常见的就是CDN的资源,我们拿来使用。


  1. 正常的JSON数据为{code: 200, res: [{id:1,state:0},{id:2,state:1}]}


如果我们 script 标签引入的资源就是带数据的。
比如console.log({code: 200, res: [{id:1,state:0},{id:2,state:1}]}),这样不就等于拿到了数据?


  1. 服务端拼接callback名称,动态生成返回数据。

从上面的原理看到JSONP就等于用script加载代码。基于<script>所以兼容性超级棒。同样因为基于<script>代码加载回来了就会执行,如果其中有恶意代码很危险。


CORS 跨域方案


CORS 是一个 W3C 标准,全称是"跨域资源共享"(Cross-origin resource sharing)。

是用来处理跨域问题的一个标准方案。分为两种情况,简单请求非简单请求


优缺点


  1. 优点


  1. 一个标准化的方案。
  2. 对于 ajax 请求的方案。支持(get、post、put、delete)等多种请求方式。
  3. 包含多种跨域情况,比如script跨域,image跨域
  4. 安全。因为他拿到的只是单纯的数据,数据具体怎么使用,还是由开发者来控制。


  1. 缺点


  1. 兼容性较弱(IE 低版本的时候还没这个规范,所以不支持)
  2. 非简单请求首次会预检


简单请求与非简单请求的区分


只要同时满足以下两大条件,就属于简单请求。


  1. 请求方法是以下三种方法之一:HEADGETPOST


  1. HTTP的头信息不超出以下几种字段:
  1. Accept
  2. Accept-Language
  3. Content-Language
  4. Last-Event-ID
  5. Content-Type:只限于三个值
  1. application/x-www-form-urlencoded
  2. multipart/form-data
  3. text/plain


凡是不同时满足上面两个条件,就属于非简单请求。


OPTIONS


浏览器对于这两种请求的处理流程是不一样的。


  • 处理流程的区别?
  • 简单请求:一次请求


  • 非简单请求:两次请求,在发送数据之前会先发一次预检(OPTIONS)请求,只有通过后才会正式的发送请求用于数据传输。


  • 预检请求
  • 请求方式(method):OPTIONS


  • 检查服务器是否支持对应的请求。
  • 通过则允许传输数据
  • 不通过则不再发送真正想要发送的消息(body)


  • 如何预检
  • 如果复杂请求是PUT等请求,则服务端需要设置允许某请求,否则预检不通过
    Access-Control-Request-Method


  • 如果复杂请求设置了请求头,则服务端需要设置允许某请求头,否则预检不通过
    Access-Control-Request-Headers



服务器代理 跨域方案


跨域的前提还记得吗?如果我们只请求当前域名不就没问题了吗?我问根据一定规则,让服务端帮我们请求


优缺点


  1. 优点


  1. 兼容极好
  2. 方便更换源


  1. 缺点


  1. 流量问题
  2. 需要主要安全问题,防止代理到内部服务器


nginx实现


server {
        listen       80;
        server_name  proxy.lilnong.top;
        location = /50x.html {
            root   html;
        }
        location /proxy {
            proxy_pass http://8.8.8.8/;
        }
    }


意味着如果请求https://proxy.lilnong.top/proxy/index.html就会被代理到http://8.8.8.8/index.html;


这里有个注意点proxy_pass http://8.8.8.8/;proxy_pass http://8.8.8.8;。前者会过滤掉location的匹配串,后者不会。


总结


ajax 的跨域目前基本依靠 CORS 来解决。


nginx 用于内网也是不错的选择。


jsonp在一些三方应用上表现还不错。


当然,不管哪种方案都需要服务端的配置

相关文章
|
13天前
|
编解码 前端开发 JavaScript
前端:Rem 及其转换原理
Rem是一种用于前端开发的相对字体大小单位,它基于根元素的字体尺寸来定义文本大小,有助于实现响应式布局和可维护性。Rem的转换原理是通过相对于HTML根元素的字体大小来设置子元素的字体大小,从而实现统一的比例调整,提高页面的适应性和灵活性。此方法简化了跨浏览器和设备的布局调整,增强了用户体验。
|
4天前
|
缓存 JavaScript 前端开发
拿下奇怪的前端报错(三):npm install卡住了一个钟- 从原理搞定安装的全链路问题
本文详细分析了 `npm install` 过程中可能出现的卡顿问题及解决方法,包括网络问题、Node.js 版本不兼容、缓存问题、权限问题、包冲突、过时的 npm 版本、系统资源不足和脚本问题等,并提供了相应的解决策略。同时,还介绍了开启全部日志、使用替代工具和使用 Docker 提供 Node 环境等其他处理方法。
|
5天前
|
存储 安全 前端开发
在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
在前端开发中需要考虑的常见web安全问题和攻击原理以及防范措施
27 0
|
28天前
|
移动开发 前端开发 JavaScript
浅谈前端路由原理hash和history
该文章详细解析了前端路由的两种模式——Hash模式与History模式的工作原理及其实现方式,并通过实例代码展示了如何在实际项目中运用这两种路由模式。
|
1月前
|
移动开发 缓存 前端开发
构建高效的前端路由系统:从原理到实践
在现代Web开发中,前端路由系统已成为构建单页面应用(SPA)不可或缺的核心技术之一。不同于传统服务器渲染的多页面应用,SPA通过前端路由技术实现了页面的局部刷新与无缝导航,极大地提升了用户体验。本文将深入剖析前端路由的工作原理,包括Hash模式与History模式的实现差异,并通过实战演示如何在Vue.js框架中构建一个高效、可维护的前端路由系统。我们还将探讨如何优化路由加载性能,确保应用在不同网络环境下的流畅运行。本文不仅适合前端开发者深入了解前端路由的奥秘,也为后端转前端或初学者提供了从零到一的实战指南。
|
2月前
|
开发者 安全 UED
JSF事件监听器:解锁动态界面的秘密武器,你真的知道如何驾驭它吗?
【8月更文挑战第31天】在构建动态用户界面时,事件监听器是实现组件间通信和响应用户操作的关键机制。JavaServer Faces (JSF) 提供了完整的事件模型,通过自定义事件监听器扩展组件行为。本文详细介绍如何在 JSF 应用中创建和使用事件监听器,提升应用的交互性和响应能力。
31 0
|
2月前
|
前端开发 JavaScript 中间件
【前端状态管理之道】React Context与Redux大对决:从原理到实践全面解析状态管理框架的选择与比较,帮你找到最适合的解决方案!
【8月更文挑战第31天】本文通过电子商务网站的具体案例,详细比较了React Context与Redux两种状态管理方案的优缺点。React Context作为轻量级API,适合小规模应用和少量状态共享,实现简单快捷。Redux则适用于大型复杂应用,具备严格的状态管理规则和丰富的社区支持,但配置较为繁琐。文章提供了两种方案的具体实现代码,并从适用场景、维护成本及社区支持三方面进行对比分析,帮助开发者根据项目需求选择最佳方案。
36 0
|
3月前
|
JavaScript 前端开发
前端框架原理自测题:根据 JSX / Vue 模板写出 render 函数 / VNode
前端框架原理自测题:根据 JSX / Vue 模板写出 render 函数 / VNode
26 0
|
3月前
|
前端开发 JavaScript
前端 JS 经典:图片裁剪上传原理
前端 JS 经典:图片裁剪上传原理
31 0
|
3月前
|
缓存 JavaScript 前端开发
前端 JS 经典:浏览器中 ESModule 的工作原理
前端 JS 经典:浏览器中 ESModule 的工作原理
44 0