【原生JS-7】什么是 JSONP,什么是 CORS,什么是跨域?

跨域:由于浏览器同源策略的限制,非同源下的请求,都会产生跨域问题

JSONP

总:JSONP 是服务器与客户端跨源通信的常用方法。利用了使用src引用静态资源时不受跨域限制的机制。
细:

  1. 网页添加一个 script 标签,向服务器请求一个脚本。请求的脚本网址有一个callback参数(?callback=bar),用来告诉服务器,客户端的回调函数名称(bar)。
  2. 服务器收到请求后,拼接一个字符串,将 JSON 数据放在函数名里面,作为字符串返回(bar({…}))。
  3. 客户端会将服务器返回的字符串,作为代码解析,这时,客户端只要定义了相应的函数,就能在该函数体内,拿到服务器返回的 JSON 数据。

正:就是简单易用,没有兼容性问题,老式浏览器全部支持,服务端改造非常小。
反:只能发GET请求(因为 JSONP 是通过动态创建 script 实现的,script 只能发送 get 请求)
补:用CORS 。CORS 允许任何类型的请求。

CORS

总:跨域资源共享。
细。核心就是设置 response header。分为简单请求和复杂请求两种。
简单请求:只需要设置 Access-Control-Allow-Origin:目标源
复杂请求:
1.浏览器发起 OPTIONS 请求。把服务器支持的操作通过响应头来表明。如Mehtod、是否接受请求中的 Cookie。
2.真实请求。
正:CORS 支持所有类型的 HTTP 请求
反:一些古老浏览器不支持 CORS。
补:用 JSONP,老式浏览器全部支持。

Vue项目如何配置跨域

1.在vue.config.js中添加proxy进行反向代理实现前端跨域

Element-plus和Axios都是基于原生的XMLHttpRequest对象实现的,而JSONP是一种不基于XMLHttpRequest对象的跨域请求机制,因此使用JSONP需要使用其他库或者自己实现跨域请求的代码。 JSONPJSON with Padding)是一种简单的跨域数据传输方式,它通过动态创建`<script>`标签来实现跨域请求。JSONP的原理是利用`<script>`标签的跨域特性,在请求中使用一个回调函数名作为参数,服务器端将数据包装在该回调函数中返回,客户端通过该回调函数来获取数据。 使用JSONP时需要注意以下几点: 1. 服务器端需要支持JSONP请求,并在响应中返回符合JSONP规范的数据。 2. 客户端需要定义一个全局的回调函数,并将该函数名作为请求参数发送给服务器端,服务器端将数据包装在该函数中返回。 3. 由于JSONP是通过`<script>`标签实现的,因此服务器端返回的数据必须是可执行的JavaScript代码,而不是普通的JSON格式数据。 以下是一个使用纯JavaScript实现的JSONP请求的示例代码: ```js function jsonp(url, callback) { const script = document.createElement('script') const callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random()) window[callbackName] = function(data) { delete window[callbackName] document.body.removeChild(script) callback(data) } const query = url.indexOf('?') === -1 ? '?' : '&' script.src = url + query + 'callback=' + callbackName document.body.appendChild(script) } ``` 以上代码定义了一个`jsonp`函数,用于发送JSONP请求。该函数接受两个参数,第一个参数是请求的URL地址,第二个参数是回调函数,用于处理服务器端返回的数据。 在Element-plus项目中使用JSONP时,可以将以上代码封装成一个单独的模块,然后在需要发送JSONP请求的地方引入该模块,例如: ```js import jsonp from './jsonp' jsonp('https://example.com/api/data', function(data) { // 处理服务器端返回的数据 }) ``` 需要注意的是,JSONP请求具有一定的安全风险,因为服务器端返回的数据是可执行的JavaScript代码,可以在客户端执行任意的JavaScript代码。因此在使用JSONP时需要仔细考虑安全问题。如果需要更安全的跨域请求方式,可以使用CORS或者其他技术来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值