当前位置:   article > 正文

js解决跨域的方案_js跨域解决方案

js跨域解决方案

什么是跨域?

指的是浏览器不能执行其他网站的脚本,简单来说是浏览器同源政策的限制,浏览器针对于ajax的限制。

同源政策

两个页面拥有相同的协议,端口,域名 就是同源,如果有一个不相同就是不同源。

同源政策产生的目的

保护用户信息安全,防止一些网站盗取用户信息。

解决跨域的方案一

1.jsonp (json with padding)

json with padding  将json 数据作为填充,简单来说就是服务器将json作为函数的参数。

原理:

1.动态创建一个script标签 

2.通过srcipt标签里的src属性 进行 跨域访问  属性里面写 跨域的地址+ callback属性作为函数传递给后端

3.服务端通过接收客户端传过来的callback属性值对应的函数名     

4.要发生过去的数据 通过函数的参数传递过去 (JSON格式)

5.将函数名对应调用的执行代码返回给客户端(服务器端响应数据一定是函数代码的调用,当浏览器对script将响应内容加载完成后,会自动调用函数)

6.并且在服务器端的执行函数是字符串,字符串包裹着函数调用的代码,如果没有包裹,则就在服务端立即执行。

缺点:只能发送get请求

 客户端代码

  1. // 1.封装一个jsonp函数;
  2. jsonp({
  3. // method: 'GET',// 所有的jsonp请求都是get请求,所以这个属性可以不写了
  4. // data: , // 写了以后太繁琐,取消
  5. url: 'http://www.localhost:3006/api/jsonp',
  6. success: function (res) {
  7. console.log(res)
  8. }
  9. })
  10. // 封装
  11. function jsonp(obj) {
  12. // 1.创建一个script标签; 2.改变src 3.给函数起名字,定义为全局函数;
  13. var script = document.createElement("script"); // 不要用innerHTML, 他不会自动发送请求
  14. // 3.给函数起名字,定义为全局函数;
  15. var fnName = "haha_123123";
  16. // window.aaa就是把aaa设置为全局变量!
  17. window[fnName] = obj.success;
  18. // 2.改变src,添加到head中
  19. script.src = obj.url + "?callback=" + fnName;
  20. // 把script标签添加到head标签中,就会发送src的请求了
  21. document.head.appendChild(script);
  22. // 代码执行完毕,把script标签删除
  23. script.onload = function () {
  24. document.head.removeChild(script);
  25. window[fnName] = undefined;
  26. }
  27. }

服务端代码

  1. app.get("/api/jsonp", (req, res) => {
  2. // 获取函数名,设置对象,发送给客户端
  3. const fnName = req.query.callback;
  4. // 定义发送给客户端的对象转换为json字符串
  5. var objStr = JSON.stringify({
  6. name: '张三',
  7. age: 18
  8. });
  9. // 字符串类型的执行函数
  10. res.send(`${fnName}(${objStr})`);
  11. });

2.CORS (CROSS-Origin Resource Sharing  跨域资源共享)

原理:服务器设置

同源政策默认阻止跨域获取资源,但是CORS给了web服务器权限,即服务器可以选择,允许访问他们的资源 

设置三个响应头 

1.Access-Control-Allow-Origin 字段  (指定了哪些域名或ip地址可以跨域 也可以写* 代表允许所有地址)

res.setHeater('Access-Control-Allow-Origin',' http://XXX.cn || * ||  ip地址  '); 

2.CORS默认支持9个请求头,如果在9个请求头之外 要单独设置,多个请求头之间要用英文逗号隔开。

res.setHeater('Access-Control-Allow-Headers','Content-Type,X-Custom-Header'); 

3.默认情况下CORS仅支持客户端发起的GET、POST、HEAD请求,如果希望客户端发送PUT、DELETE请求需要在服务器端设置

res.setHeater('Access-Control-Allow-Method','GET'); 

补充

根据头信息和请求方式,浏览器进行了优化,对请求进行划分,分为简单请求和非简单请求 

简单请求和非简单请求不做概述

简单请求 : 满足浏览器请求会直接发送 并在请求头中携带Origin 表示本次来自哪个源

如果不满足简单请求 , 会在发送请求之前发送一个预检请求 大小为0kb 请求方式为options  收到服务器响应后,分析它是否支持跨域,如果支持跨域则直接发送,如果不支持 报错!

3. webpack代理、

通过服务器代理去发ajax 这个代理是webpack提供给我们的  因为服务器只是对ajax的同源限制,并不会限制服务器之间的通信

  1. //vue.config.js
  2. devServer: {
  3. proxy: {
  4. // 如果请求地址以/api打头,就出触发代理机制
  5. // http://localhost:8080/api/login -> http://localhost:3000/api/login
  6. '/api': {
  7. target: 'http://localhost:3000' // 我们要代理的真实接口地址
  8. }
  9. }
  10. },

 

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

闽ICP备14008679号