欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简单讲解JSONP的跨域原理

程序员文章站 2022-07-10 16:19:33
...

同源策略:协议、域名、端口三者相同,则是同源。同源策略是浏览器的一种保护机制,是为了保护本地数据不被JavaScript代码获取回来的数据污染,因此拦截的是客户端发出的请求回来的数据接收,即请求发送了,服务器响应了,但是无法被浏览器接收。

正是由于同源策略的存在,所以出现了很多跨域方案,JSONP同样可以解决跨域问题。

我们先来体验使用script标签实现简单跨域:

1.JSONP跨域原理

1.在VScode中创建一个html文件

client.htnl:(模拟客户端)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>客户端</title>
</head>
<body>
    <div>客户端使用JSONP跨域</div>
    <script src="http://127.0.0.1:5501/request.js" type="text/javascript"></script>
</body>
</html>

注意:在body中的script引入的是非同源下的request.js文件,而request.js是模拟远程服务器上的文件。

2.打开VScode的新窗口创建一个服务器

新建一个server文件夹,里面放有server.htmlrequest.js

具体内容:

server.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>服务端</title>
</head>
<body> 
</body>
</html>

这个文件不需要放入任何内容,我们利用VScode运行一个HTML文件会新建一个内置的端口号不同的本地服务器。从而模拟非同源,非同源就需要跨域才能请求到服务器数据。

request.js:

(function request(){
    alert("我是来自服务端的JS");
})();

文件中是一个立即执行函数,当客户端能请求到request.js,则会执行这个函数。

现在运行两个html文件:

客户端:

简单讲解JSONP的跨域原理

服务端:

简单讲解JSONP的跨域原理

客户端端口为5500,而服务端端口5501,非同源下,客户端跨域获得了服务器的request.js文件。

总结: < script > 标签的src属性并不被同源策略所约束,所以可以通过该特性实现跨域获取任何服务器的js脚本并执行。

2.JSONP常见的callback模式

简单修改一下上面的代码:

client.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>客户端</title>
</head>
<body>
    <div>客户端使用JSONP跨域</div>
    <script>
        function getData(data){
            alert(data.message+data.count);
        }
    </script>
    <script src="http://127.0.0.1:5501/request.js" type="text/javascript"></script>
</body>
</html>

request.js:

(function request(){
    getData({message:"我来自服务端",count:110});
})();

简单讲解JSONP的跨域原理
上面展示的就是简单的callback模式:在客户端创建一个用于回调的函数(比如:getData()),然后在远程服务器上调用这个函数并且将json格式的数据作为参数,完成回调,从而实现了前后端跨域交互数据。

上面就是JSONP的callback模式的原理,我们常见的用jsonp实现跨域是这样的api:https:www.xxx.com/yyy?id=123&callback=?

那我们在客户端就可以这样定义:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>客户端</title>
</head>
<body>
    <div>客户端使用JSONP跨域</div>
    <script>
        function getData(data){
            alert(data.message+data.count);
        }
    </script>
    <script src="https:www.xxx.com/yyy?id=123&callback=getData" type="text/javascript"></script>
</body>
</html>

这里就简单讲解完了JSONP,如有错误,请指教。。。