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 相关文章推荐
防止登录页面出现在frame中js代码
Jul 22 Javascript
ZeroClipboard插件实现多浏览器复制功能(支持firefox、chrome、ie6)
Aug 30 Javascript
js实现div弹出层的方法
Nov 20 Javascript
javascript中Date对象的getDay方法使用指南
Dec 22 Javascript
基于javascript实现泡泡大冒险网页版小游戏
Mar 23 Javascript
BootStrap智能表单实战系列(八)表单配置json详解
Jun 13 Javascript
网页瀑布流布局jQuery实现代码
Oct 21 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
详解Webpack DLL用法以及功能
Jul 11 Javascript
如何测量vue应用运行时的性能
Jun 21 Javascript
javascript使用链接跨域下载图片
Nov 01 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
Aug 22 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写MySQL数据 实现代码
2009/06/15 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
php实现html标签闭合检测与修复方法
2015/07/09 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
js解析与序列化json数据(二)序列化探讨
2013/02/01 Javascript
JavaScript常用全局属性与方法记录积累
2013/07/03 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
JavaScript简单实现鼠标拖动选择功能
2014/03/06 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
jQuery拖动布局其结果保存到数据库
2015/10/09 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
Jquery和Js获得元素标签名称的方法总结
2016/10/08 Javascript
gulp解决跨域的配置文件问题
2017/06/08 Javascript
vue 路由嵌套高亮问题的解决方法
2018/05/17 Javascript
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
js实现无缝轮播图特效
2020/05/09 Javascript
JavaScript代码简化技巧实例解析
2020/09/09 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
django echarts饼图数据动态加载的实例
2019/08/12 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
python time()的实例用法
2020/11/03 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
美国最大点评网站:Yelp
2018/02/14 全球购物
上海雨人软件技术开发有限公司测试题
2015/07/14 面试题
大学毕业典礼演讲稿
2014/09/09 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
2016年党员创先争优承诺书
2016/03/25 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
python字典的元素访问实例详解
2021/07/21 Python
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server