ajax请求前端跨域问题原因及解决方案


Posted in Javascript onOctober 16, 2021

一、跨域是怎么形成的

当我们请求一个url的 协议、域名、端口三者之间任意一个与当前页面url的协议、域名、端口 不同这种现象我们把它称之为跨域

跨域会导致:
1、无法读取非同源网页的 Cookie、LocalStorage 和 IndexedDB
2、无法接触非同源网页的 DOM
3、无法向非同源地址发送 AJAX 请求(可以发送,但浏览器会拒绝接受响应)

二、导致跨域的根本原因

导致跨域的根本原因是请求浏览器的同源策略导致的 ,而跨域请求报错的原因是: 浏览器同源策略 && 请求是ajax类型 && 请求确实跨域了

三、解决方法

给大家介绍三种方法 jsonp,cors,代理转发

1 、JSONP

JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本IE),缺点是只支持get请求,不支持post请求。
原理:img、srcipt,link标签的src或href属性不受同源策略限制,可以用来作为请求,后端接受请求后返回一个回调函数callback,调用前端已经定义好的函数,从而实现跨域请求。

举个很简单的例子 : 我们通过img标签的src属性, 请求一个网络地址的图片 ,这就是非同源请求了 ,但是由于浏览器的同源策略只对ajax请求有效所以 我们的请求不会受到影响 。换句话来说 只有ajax请求才会产生跨域问题。

2、 CORS

CORS 是跨域资源分享(Cross-Origin Resource Sharing)的缩写。它是 W3C 标准,属于跨源 AJAX 请求的根本解决方法。

CORS允许任何类型的请求。在使用CORS来访问数据的时候,客户端不需要更改任何数据访问逻辑。所有的一切工作都是在服务端及浏览器之间自动完成的。前端代码与发送普通Ajax请求没有差异,我们只需在服务端设置即可(后端的活)

3 、代理转发

ajax请求前端跨域问题原因及解决方案

在前端服务和后端接口服务之间 架设一个中间代理服务,它的地址保持和前端服务器一致,那么:
这样,我们就可以通过中间这台服务器做接口转发,在开发环境下解决跨域问题,看起来好像挺复杂,其实vue-cli已经为我们内置了该技术,我们只需要按照要求配置一下即可。

vue.config.js 的devServer(开发环境)里 配置代理服务器 通过这个代理服务器发送请求 这样就不纯在跨域的问题了 代码如下:

module.exports = {
  devServer: {
    // ... 省略
    // 代理配置
    proxy: {
        // 如果请求地址以/api打头,就出触发代理机制
        // http://localhost:9588/api/login -> http://localhost:3000/api/login
        '/api': {
          target: 'http://localhost:3000' // 我们要代理的真实接口地址
        }
      }
    }
  }
}

记得baseURL里的根路径 是相对地址,而不能是绝对地址

以上就是ajax请求前端跨域问题原因及解决方案的详细内容,更多关于ajax跨域问题原因及解决的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
jQuery.each()用法分享
Jul 31 Javascript
JavaScript高级程序设计 阅读笔记(二十一) JavaScript中的XML
Sep 14 Javascript
js实现的点击div区域外隐藏div区域
Jun 30 Javascript
angularjs指令中的compile与link函数详解
Dec 06 Javascript
Node.js node-schedule定时任务隔多少分钟执行一次的方法
Feb 10 Javascript
基于jQuery通过jQuery.form.js插件实现异步上传
Dec 13 Javascript
javascript作用域链与执行环境详解
Mar 25 Javascript
浅谈Vue SSR 的 Cookies 问题
Nov 20 Javascript
JS实现的简单分页功能示例
Aug 23 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
Apr 30 Javascript
如何阻止移动端浏览器点击图片浏览
Aug 29 Javascript
VUE异步更新DOM - 用$nextTick解决DOM视图的问题
Nov 06 Javascript
浅谈TypeScript 索引签名的理解
JavaScript 反射学习技巧
Oct 16 #Javascript
JS的深浅复制详细
Oct 16 #Javascript
JS 基本概念详细介绍
Oct 16 #Javascript
AJAX实现指定部分页面刷新效果
AJAX实现省市县三级联动效果
Oct 16 #Javascript
简单聊聊Vue中的计算属性和属性侦听
Oct 05 #Vue.js
You might like
两个开源的Php输出Excel文件类
2010/02/08 PHP
php实现将上传word文件转为html的方法
2015/06/03 PHP
如何解决phpmyadmin导入数据库文件最大限制2048KB
2015/10/09 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
js查找父节点的简单方法
2008/06/28 Javascript
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
JQuery的Validation插件中Remote验证的中文问题
2010/07/26 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
Window.Open如何在同一个标签页打开
2014/06/20 Javascript
JavaScript中用于四舍五入的Math.round()方法讲解
2015/06/15 Javascript
JS+CSS实现带有碰撞缓冲效果的竖向导航条代码
2015/09/15 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
前端JS面试中常见的算法问题总结
2016/12/23 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
javascript ES6 新增了let命令使用介绍
2017/07/07 Javascript
AngularJS遍历获取数组元素的方法示例
2017/11/11 Javascript
vue.js数据绑定操作详解
2018/04/23 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
Angular 中使用 FineReport不显示报表直接打印预览
2019/08/21 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
详解Python中列表和元祖的使用方法
2015/04/25 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
python爬虫用scrapy获取影片的实例分析
2020/11/23 Python
HTML5 语音搜索只需一句代码
2013/01/03 HTML / CSS
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
2014年母亲节寄语
2014/05/07 职场文书
工作能力自我评价2015
2015/03/05 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
大学校园招聘会感想
2015/08/10 职场文书
python中super()函数的理解与基本使用
2021/08/30 Python
MySQL 分区表中分区键为什么必须是主键的一部分
2022/03/17 MySQL