当前位置:   article > 正文

解决跨域 报错Access to XMLHttpRequest at ‘http://127.0.0.1:3001/user‘ from origin ‘http://127.0.0.1:5501‘

access to xml

Access to XMLHttpRequest at 'http://127.0.0.1:3001/user' from origin 'http://127.0.0.1:5501' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

出现上述情况报错就是因为跨域了。

跨域是为了保障安全,浏览器根据同源策略(协议,域名,端口号都要一致)给出的限制。

ajax能直接获取同源的数据。不同源的需要解决跨域问题

一、跨域的体现:

1.把解决跨域方案关闭,运行后台

2.open in live server, 出现报错

 二、解决跨域:

1.开发中最常用的:给后台说添加个响应头,允许跨域

  1. //设置允许跨域的域名,*代表允许任意域名跨域
  2. res.setHeader(
  3. 'Access-Control-Allow-Origin',"*"
  4. )

2.利用proxy反向代理,通过拦截解决跨域

3.利用jsonp解决跨域,原理就是利用script标签的src属性,可以跨域。

(1)本地的src属性解决跨域

创建一个js文件,存放数据

使用路径后边拼接callback=函数        只要src资源路径有callback 就是在解决跨域   且通过之后的函数进行传值拿数据

  1. <!-- 调用数据必须在src引入的前边 -->
  2. <script>
  3. function show(val) {
  4. console.log(val);
  5. }
  6. </script>
  7. </html>
  8. <!-- src 就是能跨域
  9. jsonp解决跨域 的原理: 利用src的跨域能力
  10. -->
  11. <script src="./test.js?callback=show"></script>

(2)动态的创建一个script标签  增加src属性来解决跨域

先写一个js文件存储数据,并设置接口地址(callback=函数名   解决跨域的底层   利用get拼接路径)

  1. /*
  2. jsonp 接口地址:
  3. http: //localhost:3003/jsonp?callback=test
  4. 传参数
  5. 约定请求的参数中的指定参数:callback
  6. 服务器发现是 JSONP 请求, 就会把原来的返回对象变成 JS 代码。
  7. JS 代码是函数调用的形式, 它的函数名是 callback 的值,
  8. 它的函数的参数就是原来需要返回的结果。
  9. */
  10. //通过require将http库包含到程序中
  11. let http = require('http');
  12. //引入url模块解析url字符串
  13. let url = require('url');
  14. //引入querystring模块处理query字符串
  15. let querystring = require('querystring');
  16. //创建新的HTTP服务器
  17. let server = http.createServer();
  18. //通过request事件来响应request请求
  19. server.on('request', function (req, res) {
  20. let urlPath = url.parse(req.url).pathname;
  21. let qs = querystring.parse(req.url.split('?')[1]);
  22. // 如果请求路径里面包含有jsonp 和callback 就判断出来这是一个jsonp请求
  23. if (urlPath === '/jsonp' && qs.callback) {
  24. res.writeHead(200, {
  25. 'Content-Type': 'application/json;charset=utf-8'
  26. });
  27. // 此处的data数据 就是后台要返回个前端的数据
  28. let data = {
  29. "msg": "jsonp返回的数据",
  30. "fn": qs.callback
  31. };
  32. data = JSON.stringify(data);
  33. // 根据callback的值,创建函数 data 是函数内传递的参数
  34. let callback = qs.callback + '(' + data + ');';
  35. console.log(callback);
  36. // 向前端进行响应
  37. res.end(callback);
  38. } else {
  39. res.writeHead(200, {
  40. 'Content-Type': 'text/html;charset=utf-8'
  41. });
  42. res.end('Hell World\n');
  43. }
  44. });
  45. server.listen(3003,'localhost',function(){
  46. console.log('your server is running here:localhost:3003');
  47. });

后台运行

动态的创建src

  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>Document</title>
  7. </head>
  8. <body>
  9. <button onclick="getJsonp()">点击jsonp</button>
  10. </body>
  11. </html>
  12. <script>
  13. function show(v) {
  14. console.log(v);
  15. }
  16. function getJsonp() {
  17. var script_ = document.createElement("script");
  18. script_.src = "http://localhost:3003/jsonp?callback=show";
  19. document.body.appendChild(script_);
  20. if (script_) {
  21. script_.parentNode.removeChild(script_);
  22. }
  23. }
  24. </script>

总结:跨域的出现是因为浏览器同源策略,为了安全,解决跨域实际开发中就是后台添加个响应头  其余方式做个了解即可。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/749324
推荐阅读
相关标签
  

闽ICP备14008679号