博客列表 >CORS和JSONP两种方式实现跨域请求

CORS和JSONP两种方式实现跨域请求

王娇
王娇原创
2020年05月24日 21:43:37666浏览

学习总结

  • 利用cors和jsonp可以实现跨域数据请求
  • 这样就可以实现前端数据和后端数据库数据不在同一服务器上,如果后端数据比较庞大可以寄存在另一个专门用来存储数据的服务器上

1.1CORS实现跨域请求 php11.edu中的cors.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>cors跨域请求</title>
  7. </head>
  8. <body>
  9. <h2>CORS跨域请求</h2>
  10. <div>
  11. <label for="stuName">姓名:</label>
  12. <span id="stuName"></span>
  13. </div>
  14. <div>
  15. <label for="stuAge">年龄:</label>
  16. <span id="stuAge"></span>
  17. </div>
  18. <div>
  19. <button onclick="getData()">通过CORS获取其它域数据</button>
  20. </div>
  21. <script>
  22. function getData() {
  23. var xml = new XMLHttpRequest();
  24. xml.onreadystatechange = function () {
  25. if (xml.readyState === 4 && xml.status === 200) {
  26. $data = JSON.parse(xml.responseText);
  27. console.log($data.name, $data.age);
  28. document.getElementById("stuName").innerHTML = $data.name;
  29. document.getElementById("stuAge").innerHTML = $data.age;
  30. }
  31. };
  32. //当前地址
  33. //http://php11.edu/0522/cors.html
  34. //跨域请求数据,需要在data.php文件中设置请求头
  35. xml.open("GET", "http://58city.com/data.php", true);
  36. //http://58city.com/data.php
  37. //data.php中设置请求头
  38. //如果使用post请求,需要设置下面一条
  39. // header("Content-Type:text/plain");
  40. //设置头部,不设置的话请求会被拒绝
  41. // header("Access-Control-Allow-Origin:http://php11.edu");
  42. xml.send(null);
  43. }
  44. </script>
  45. </body>
  46. </html>

1.2 58city.com域中的文件 data.php

  1. <?php
  2. //http://58city.com/data.php
  3. //如果使用post请求,需要设置下面一条
  4. header("Content-Type:text/plain");
  5. //设置头部,不设置的话请求会被拒绝
  6. header("Access-Control-Allow-Origin:http://php11.edu");
  7. $stu['name'] = 'angle';
  8. $stu['age'] =32;
  9. echo json_encode($stu);
  10. ?>

1.3 代码显示效果


2.1 JSONP实现跨域请求 php11.edu中的jsonP.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>jsonP实现跨域请求</title>
  7. </head>
  8. <body>
  9. <h2>jsonP实现跨域请求</h2>
  10. <div>
  11. <label for="stuName">姓名:</label>
  12. <span id="stuName"></span>
  13. </div>
  14. <div>
  15. <label for="stuAge">年龄:</label>
  16. <span id="stuAge"></span>
  17. </div>
  18. <div>
  19. <button onclick="getData()">通过jsopP获取其它域数据</button>
  20. </div>
  21. <script>
  22. //jsonP回调函数
  23. //handle中的参数是一个对象,(参数已经解析json字符串为一个对象)
  24. function handle(jsonPData) {
  25. var $data = jsonPData;
  26. console.log($data.name, $data.age);
  27. document.getElementById("stuName").innerHTML = $data.name;
  28. document.getElementById("stuAge").innerHTML = $data.age;
  29. }
  30. //html头部动态创建一个script标签,通过src属性获取外部数据
  31. //scr = "http://58city.com/data2.php?jsonp=回调函数名";
  32. function getData() {
  33. var script = document.createElement("script");
  34. script.src = "http://58city.com/data2.php?jsonp=handle";
  35. document.head.appendChild(script);
  36. //http://58city.com/data2.php
  37. //data2中的数据
  38. // <?php
  39. // $stu['name'] = 'Eric';
  40. // $stu['age'] =6;
  41. // $jsonStr = json_encode($stu);
  42. // //handle是请求数据的回调函数名,参数是一个json字符串
  43. // echo "handle($jsonStr)";
  44. // ?>
  45. }
  46. </script>
  47. </body>
  48. </html>

2.2 58city.com中的 data2.php

  1. <?php
  2. //http://58city.com/data2.php
  3. $stu['name'] = 'Eric';
  4. $stu['age'] =6;
  5. $jsonStr = json_encode($stu);
  6. //handle是请求数据的回调函数名,参数是一个json字符串
  7. echo "handle($jsonStr)";
  8. ?>

2.3代码显示效果


3.1利用jsonp实现跨域提取数据 php11.edu中的showGoods.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>商品展示页</title>
  7. <link rel="stylesheet" href="showGoods.css" />
  8. </head>
  9. <body>
  10. <div class="show" id="show">
  11. <h2>商品展示页面</h2>
  12. <div>
  13. <span>编号</span><span>名称</span><span>价格</span><span>单位</span
  14. ><span>时间</span>
  15. </div>
  16. </div>
  17. </body>
  18. <script>
  19. //jsonP回调函数
  20. //handle中的参数是一个对象,(参数已经解析json字符串为一个对象)
  21. function handle(jsonPData) {
  22. // //创建一个div标签
  23. // var div = document.createElement("div");
  24. // //添加到html中
  25. // document.getElementById("show").appendChild(div);
  26. // //设置div的id值
  27. // div.id = "1";
  28. // //定义span标签
  29. // var span = document.createElement("span");
  30. // //span标签添加文件结点
  31. // var node = document.createTextNode("1");
  32. // //把文本结点的数据添加到span标签上
  33. // span.appendChild(node);
  34. // //把span标签添加到div里
  35. // document.getElementById("1").appendChild(span);
  36. for (var i = 0; i < jsonPData.length; i++) {
  37. var div = document.createElement("div");
  38. document.getElementById("show").appendChild(div);
  39. div.id = i;
  40. for (key in jsonPData[i]) {
  41. var res = jsonPData[i][key]; //获取的数据
  42. //创建一个span标签
  43. var span = document.createElement("span");
  44. //span标签添加文件结点
  45. var node = document.createTextNode(res);
  46. //把文本结点的数据添加到span标签上
  47. span.appendChild(node);
  48. document.getElementById(i).appendChild(span);
  49. }
  50. }
  51. }
  52. //html头部动态创建一个script标签,通过src属性获取外部数据
  53. //scr = "http://58city.com/data2.php?jsonp=回调函数名";
  54. var script = document.createElement("script");
  55. script.src = "http://58city.com/goods.php?jsonp=handle";
  56. document.head.appendChild(script);
  57. </script>
  58. </html>

3.2 58city.com中的 goods.php

  1. <?php
  2. require 'autoLoad.php';
  3. use compotents\conn\DBconn;
  4. $user =new DBconn();
  5. $table = 'tb_goods';//表名
  6. $limit =10; //显示10条记录
  7. $records = $user->select($table,'*','*',$limit);
  8. $jsonStr = json_encode($records);
  9. echo "handle($jsonStr)";
  10. ?>

3.3代码显示效果

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议