JSONP

jsonp菜鸟教程
非官方的跨域解决方案,只支持get请求,借助script标签。
script标签本身就带有跨域特性。
例子:

  1. <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>

原理

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>原理演示</title>
  8. <style>
  9. #result{
  10. width:300px;
  11. height: 100px;
  12. border:solid 1px #78a;
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <div id="result"></div>
  18. <!-- <script src="./js/app.js"></script> -->
  19. <script>
  20. //处理数据
  21. function handle(data){
  22. //获取result元素
  23. const result = document.getElementById("result");
  24. result.innerHTML = data.name;
  25. }
  26. </script>
  27. <!-- <script src="http://127.0.0.1:5500/code/%E8%B7%A8%E5%9F%9F/2-JSONp/js/app.js"></script> -->
  28. <script src="http://127.0.0.1:8000/jsonp-server"></script>
  29. </body>
  30. </html>

server.js

  1. //jsonp服务
  2. app.all('/jsonp-server',(resquest,response)=>{
  3. // response.send('console.log("hello jsonp server")')//必须要js语句
  4. const data={
  5. name:"跨域ttt"
  6. };
  7. //将数据转换为字符串
  8. let str = JSON.stringify(data);
  9. //返回结果
  10. response.end(`handle(${str})`);//返回函数调用 并把参数放在里面
  11. //函数要在html里面提前声明好
  12. });

返回结果中 返回函数调用 并把参数放在里面 并且在调用的界面中 函数要提前声明

原生jsonp实践

  1. //html
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  7. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  8. <title>JSON案例</title>
  9. </head>
  10. <body>
  11. 用户名:<input type="text" id="username">
  12. <p></p>
  13. <script >
  14. //获取input元素
  15. const input = document.querySelector('input');
  16. const p = document.querySelector('p');
  17. //声明handle函数
  18. function handle(data){
  19. input.style.border = 'solid 1px #f00'
  20. //修改p标签的提示文本
  21. p.innerHTML = data.msg;
  22. }
  23. //绑定事件
  24. input.onblur = function(){
  25. //获取用户输入值
  26. let username = this.value;
  27. //向服务端发送 请求 检测用户名是否存在
  28. //1.创建script标签
  29. const script = document.createElement('script');
  30. //2.设置标签的src属性
  31. script.src = 'http://127.0.0.1:8000/check-username';
  32. //3.将script插入到文档中
  33. document.body.appendChild(script);
  34. }
  35. </script>
  36. </body>
  37. </html>
  38. //server.js
  39. //用户名检测
  40. app.all('/check-username',(resquest,response)=>{
  41. // response.send('console.log("hello jsonp server")')//必须要js语句
  42. const data={
  43. exist:1,
  44. msg:"用户名已经存在"
  45. };
  46. //将数据转换为字符串
  47. let str = JSON.stringify(data);
  48. //返回结果
  49. response.end(`handle(${str})`);//返回函数调用 并把参数放在里面
  50. //函数要在html里面提前声明好
  51. });

jquery发送jsonp请求

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>jq发送jsonp</title>
  8. <style>
  9. #result {
  10. width:300px;
  11. height:100px;
  12. border:solid 1px #089;
  13. }
  14. </style>
  15. <script crossorigin:"anonymous" src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
  16. </head>
  17. <body>
  18. <button>点击发送jsonp请求</button>
  19. <div id="result">
  20. </div>
  21. <script >
  22. $('button').eq(0).click(function(){
  23. $.getJSON('http://127.0.0.1:8000/jquery-jsonp-server?callback=?',function(data){
  24. // console.log(data)
  25. $('#result').html(`
  26. 名称:${data.name}<br>
  27. 位置:${data.city}
  28. `)
  29. });
  30. });
  31. </script>
  32. </body>
  33. </html>
  34. server
  35. //jq jsonp
  36. app.all('/jquery-jsonp-server',(request,response)=>{
  37. const data={
  38. name:'jq jsonp server',
  39. city:['school','home']
  40. };
  41. //将数据转换为字符串
  42. let str = JSON.stringify(data);
  43. //接受callback参数
  44. let cb = request.query.callback;
  45. //返回结果
  46. response.end(`${cb}(${str})`);//返回函数调用 并把参数放在里面
  47. //函数要在html里面提前声明好
  48. });

CORS

cors | mdn
官方的跨域解决方案,不需要在客户端做任何特殊操作,完全在服务器中进行处理,默认支持get 和 post 请求
如何工作?
通过设置一个响应头来告诉浏览器,该请求允许跨域,浏览器收到该响应后就会对该响应放行、

如果直接使用

  1. <body>
  2. <button>发送请求</button>
  3. <div id="result"></div>
  4. <script>
  5. const btn = document.querySelector('button');
  6. btn.onclick = function(){
  7. //1.创建对象
  8. const x = new XMLHttpRequest();
  9. //2.初始化设置
  10. x.open("GET","http://127.0.0.1:8000/cors-server");
  11. //3.发送
  12. x.send();
  13. //4.绑定事件
  14. x.onreadystatechange = function(){
  15. if(x.readyState === 4){
  16. if(x.status >= 200 ){
  17. console.log(x.response);
  18. }
  19. }
  20. }
  21. }
  22. </script>
  23. app.all('/cors-server',(request,response)=>{
  24. response.send("hello cors");
  25. })

image.png
要解决这个问题 就是在server.js 的app.all 中 设置一个响应头 其实也就是之前一直有的东西
response.setHeader(“Access-Control-Allow-Origin”,”*”);

就我目前所学而言 cors 会方便很多
更多的直接看上面那个mdn的链接 讲的非常好 非常的详细