JSONP
Ajax请求的限制
- ajax只能向自己的服务器发送请求。比如一个A网站一个B网站,A网站的HTML只能向A网站的服务器发送请求,不能向B网站的服务器发送请求
什么是同源
- 如果两个页面拥有相同的协议域名和端口,那么这两个页面就属于同源,如果有一个不一样,那么就不是同源
- 同源策略是为了保护用户信息的安全,防止恶意网站窃取数据。最初的同源策略是指A网站在客户端设置cookie,B网站不能使用
使用JsonP解决
-
将不同源的请求地址写道script标签中
<script src='url'></script> // script标签不受同源策略的影响 // 请求地址不一定非得是.js结尾的,但是返回结果必须是javascript代码 -
服务器端响应数据的代码必须是一个函数的调用,真正要发送给客户端的数据作为函数的参数传进来
const data = 'fn({key1:value1,key2:value2})'; res.send(data); -
因为函数在客户端是要调用的,所以要先定义这个函数,这样等服务器将数据返回过来,就可以调用了
<body> <script> function fn(data){ console.log(data);// fn(:,:){} 调用函数 } </script> <script src='urladdress'></script> </body> // 函数必须定义在全局作用域,,并且定义在script标签上面 -
处理服务端响应给客户端的数据
function fn(data){ console.log(data); } -
以上是html界面加载完就会触发函数,设置动态的话就可以利用鼠标点击事件,然后动态生成script标签,并且将不同源地址添加到标签的src属性值当中
<body> <button id='btn'> 点我发送 </button> <script> function fn(data){ console.log(data);// fn(:,:){} 调用函数 } </script> <script> var btn = document.ElementById('btn'); btn.onclick=function(){ var script = document.createElement('script'); script.src='urladdress'; // 创建标签并添加属性 document.body.appendChild(script); // 将标签写进body标签中,不然白干 } </script> </body> -
客户端需要将函数名字发传递给服务器,毕竟和后端有交流,如果后端不知道函数名,比较麻烦,还得沟通确认,这里直接将函数名发送给后端就行了
<body> <script> function fn(data){ console.log(data);// fn(:,:){} 调用函数 } </script> <script src='urladdress..?callback=函数名'></script> <-- callback=函数名 !-> </body> // 后端代码 app.get('/url',(req,res)) => { const fnName = req.query.callback; const result = fnName+'({name:"西瑞"})'; res.send(result) }

浙公网安备 33010602011771号