什么是跨域报错?

为什么会出现浏览器跨域报错?

简单来讲就是:不同源的ajax请求,具体来说满足以下三个条件就会出现跨域错误
1. 请求响应双方url不同源。
双方url:发出请求所在的页面 与 所请求的资源的url
​ 同源是指:协议相同域名相同端口相同 都相同。
2. 请求类型是ajax请求
3. 浏览器觉得不安全
跨域问题出现的基本原因是浏览器的同源策略。同源策略是一个重要的安全策略,它限制一个origin的文档或者它加载的脚本如何能与另一个源的资源进行交互。

解决思路

  1. 请求响应双方url不同源
    对策: 服务器代理
  2. 请求是ajax
    对策: 改发JSONP请求
  3. 浏览器觉得不安全
    对策1: 可以安装一个浏览器插件allow-control-allow-origin 绕过同源策略。
    对策2: 用postman软件测试
    对策3: 使用cors

注意点

错误原因:不同源ajax请求,后端还是能收到请求的,错误是发生在浏览器端
下面对于JSONP请求法和CORS方法展开讲述:

具体解决方案:

(一)JSONP请求法

实现原理

  1. script的src属性可以请求外部的js文件,这个请求不是ajax,它没有跨域问题.
  2. 借助 script 标签src请求服务端上的接口.
  3. 服务端的接口返回JavaScript 脚本,并附上要返回的数据.

实现方法1

1. 前端页面: 创建script标签并让src指向接口地址

<html><script src="http://localhost:3000/get"></script>
</html>

注意点:
script标签中的src会指向一个后端接口的地址。由于script标签并不会导致跨域问题,所以这里的请求是可以正常发送和接收的。
与我们之前理解的src指向某个具体的.js文件不同,我们只需要确保src所指向的地址的返回内容是js代码就行了,而不必要src直接指向某个.js文件。
接口地址中返回的内容将会作为script标签的主体。

2. 后端:让接口返回函数调用表达式,并传入数据

const express = require('express');
const app = express();
app.get('/get', (req, res) => {const data =  JSON.stringify({a:1,b:2})const fnStr = `fn(${data})`res.end(fnStr); // 返回字符串,内容是:函数调用语句
})app.listen(3000, () => {console.log('你可以通过http://localhost:3000来访问...');
});

3. 在前端页面补充fn函数

<script>function fn(rs) {console.log(rs);}
</script>
<html><script src="http://localhost:3000/get"></script>
</html>

实现方法2 (简便操作)

1. 利用jQuery封装的jsonp方式,在前端页面给ajax请求添加一个dataType属性,其值为"jsonp".

$.ajax({type: 'GET',url: 'http://localhost:4000/get', success: function (result) {console.log(result);},dataType: 'jsonp' // 必须要指定dataType为jsonp
});

2. 在后端接口express框架提供了一个名为jsonp的方法来处理jsonp请求:

const express = require('express');
const app = express();
app.get('/get', (req, res) => {let data = {a:1,b:2}// res.json(data)res.jsonp(data)
})
app.listen(3000, () => {console.log('你可以通过http://localhost:3000来访问...');
});

特点

1. jsonp方法不是ajax请求
2. jsonp只能支持get方式
3. jsonp兼容性比较好

(二)cors方法

实现原理

CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)。它允许浏览器向跨源服务器,发出XMLHttpRequest`请求,从而克服了AJAX只能同源使用的限制。
CORS需要浏览器和服务器同时支持。目前,所有浏览器都支持该功能,IE浏览器不能低于IE10(ie8通过XDomainRequest能支持CORS)。

实现方法1 : 手写方法实现

通过在被请求的路由中设置header头,可以实现跨域。

app.get('/get', (req, res) => {// * 表示允许任何域名来访问res.setHeader('Access-Control-Allow-Origin', '*')// 允许指定源访问// res.setHeader('Access-Control-Allow-Origin', 'http://www.xxx.com')res.send(Date.now().toString())
})
  • 这种方案无需客户端作出任何变化(客户端不用改代码),就当跨域问题不存在一样。
  • 服务端响应的时候添加一个 Access-Control-Allow-Origin 的响应头

实现方法2: 使用cors包

下载nmp包 cors,当做express中的中间件使用,代码如下

const express = require('express')
const app = express()
app.use(express.static('public'))
app.use(express.json())
const cors = require('cors')
app.use(cors())
// get请求(解决跨域问题方案1)
app.get('/get',(req,res)=>{res.json({msg:'get请求,ok'})
})
// post请求
app.post('/postJSON',(req,res)=>{console.log('接收到的数据是', req.body)res.json({msg:'ok', data: req.body})
})app.listen(3000, ()=>{console.log(3000);
})

特点

1.前端不需要做额外的修改,就当跨域问题不存在。
2.是ajax
3. 支持各种方式的请求(post,get…)
4. 浏览器的支持不好(标准浏览器都支持)

前端开发中的跨域问题及解决方案相关推荐

  1. Spring boot 和Vue开发中CORS跨域问题

    1. 遇到的问题: 我用spring-boot 做Rest服务,Vue做前端框架,用了element-admin-ui这个框架做后台管理.在调试的过程中遇到了如下错误: Preflight respo ...

  2. 关于flex开发中的跨域访问问题

    1,一次偶然的机会碰到这个问题了,flex有跨域访问问题,但是,imgage.soure='其它域名地址是可以的'.能显示出来,为什么? 不是说有跨越访问的问题么,其实flash说的跨域访问问题,不是 ...

  3. (转)HTML5开发中Access-Control-Allow-Origin跨域问题

    今天准备通过JavaScript的方式调用问说问答的内容,由于使用的不同的二级域名,遇到了一个跨域问题,虽然可以使用JSON或者XML来解决这个问题,但是我们可以通过Access-Control-Al ...

  4. web开发中的跨域问题

    一.为什么会有跨域问题? 1.浏览器限制 2.跨域 域名,端口,协议任意一个不相同; 3.XHR(XMLHttpRequest)请求 满足以上三个条件才会触发跨域,任意一个不满足就不算是跨域; 二.解 ...

  5. java后端跨域问题常用解决方案

    前言 在项目开发中,跨域问题是经常遇到的,说到底,跨域是浏览器的一种安全自我保护机制的体现,即域的同源策略的保护,关于跨域解决,网上参考的资料挺多,比如前端解决手段.后端解决办法.网关层的方案等,下面 ...

  6. Vue跨域问题及解决方案

    什么是跨域   跨域指浏览器不允许当前页面的所在的源去请求另一个源的数据.源指协议,端口,域名.只要这个3个中有一个不同就是跨域. 这里列举一个经典的列子: #协议跨域 http://a.baidu. ...

  7. 22-CMS前端页面查询开发-Api调用-跨域解决

    跨域问题解决 测试 上边的代理 ,结果 报错如下 : No 'Access-Control-Allow-Origin' header is present on the requested resou ...

  8. axios请求跨域前端解决_Vue中axios跨域请求解决方法

    跨域:指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,浏览器执行 js 脚本时,会检查这个脚本属 ...

  9. Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题

    Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题 参考文章: (1)Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题 (2)https://ww ...

最新文章

  1. android的armeabi和armeabi-v7a
  2. wxWidgets:wxLogNull类用法
  3. 四大步骤做好需求调研
  4. inline行内元素
  5. java 基础知识学习 内存泄露(memory leak) VS 内存溢出(out of memory)以及内存管理...
  6. 如何在vs2010中使用SSE指令集
  7. Julia : where与类型限定
  8. 【学习笔记】浅识差分隐私
  9. spring整合redis菜鸟版
  10. vs 登录按钮验证_外服战网新增登录方式:关联Apple ID即可快速登录
  11. 苦涩的技术我该怎么学?Akka 实战
  12. xp系统itunes无法连接服务器失败,xp系统iTunes无法连接到iTunes store的修复步骤
  13. pandas window中涉及的offset是什么意思
  14. Rasa课程、Rasa培训、Rasa面试系列之Rasa幕后英雄系列-解决方案工程师Ben Quachtran
  15. python控制相机,在OpenCV / Python中设置相机参数
  16. git的pull和push操作
  17. codeforces 718E. Matvey's Birthday
  18. Chrome浏览器首页被hao123劫持的解决办法
  19. git/码云+npm语法
  20. 关于 CPU 推测执行漏洞,您需要知道这些

热门文章

  1. BSC Web3生态深度研究
  2. 怎么区分zh和ch_怎样区分zhchsh与zcs
  3. 前端实现HTML转PDF下载的两种方式
  4. 【Java并发编程 】同步——volatile 关键字
  5. window global
  6. 设置centos笔记本合盖不休眠
  7. 通信设备选cat1还是选nbiot
  8. 成都物韵电子商务有限公司推广网店需要注意什么?
  9. 小说作者推荐:漫漫何其多合集
  10. 17、文件IO详解及实例