前端经典面试题——跨域

257 阅读2分钟

跨域

1.报错格式

出现跨域时,控制台会报如图所示的错误

1571856567565.png

2.跨域的定义

跨域 : ajax的请求地址与页面地址不同源

需要注意的几点:

  • ajax请求 : 只有ajax请求才会出现跨域
  • 当前页面地址 : location.href
  • 同源 : 协议名、ip地址、端口号均相同

3.同源,不同源出现的原因

浏览器为了保护电脑安全。

出于安全考虑,浏览器不允许页面向不同源的接口请求数据,因为如果接口和网页不同源,浏览器认为是2个不同的服务器。

4.跨域的解决办法

(1)CORS

目前的主流方法,也是最简单的方法。

解决单个接口的跨域: 在路由里加上 res.setHeader('Access-Control-Allow-Origin', '*')

解决所有接口的跨域: 利用express自带的中间件cors,安装cors后设置跨域中间件

//设置跨域中间件 : 类似于拦截器,会给每一个路由自动设置允许跨域响应头
// (1)导入模块
 const cors = require('cors')
// (2)使用模块
app.use(cors())

(2)原生jsonp

  • JSONP的核心原理:如果script标签的src属性的请求,服务器返回的是一个函数调用,则浏览器会执行这个函数。

  • 实际开发中JSONP的工作流程:

(1)设置script标签的src属性,向一个不同源的接口发送一个get请求(JSONP只支持get请求,不支持post)

(2)src属性发送请求时,在参数中额外携带一个callback的参数,参数值是一个在页面中预先定于好的函数名(callback属性值:预先定义的函数名,这个函数必须要在script标签之前定义)

(3)服务器接收到请求之后,获取callback的参数值

(4)服务器将要响应的数据拼接成 函数调用格式,通过传参的方式将响应数据返回给浏览器

  • 流程图如下

1653017500396.png