什么是跨域?JS跨域/Vue代理跨域/nginx代理跨域

一、什么是跨域?

所谓跨域 即要牵扯到 同源策略

同源策略:是指协议,域名,端口都要相同,其中有一个不同都会产生跨域 引发限制;

同源策略 即是浏览器的核心 浏览器的安全手段 防止被他人窃取数据信息等等

// 注意 端口号默认80 可省略

// 引发同源限制后 首先dom无法获取 cookie和localStorage无法读取 ajax无法发送请求

// 同源策略这一措施 对开发人员前后端数据交互造成了困扰 所以有了跨域的解决方案

二、如何解决跨域问题? 

   jsonp方式

// jsonp方式是通过script标签的src属性进行跨域 调用接口获取数据的 因为src属性具有天然可跨域特性 可以无视同源限制
// 这种标签 还有img的src和link的href属性同样具有跨域的特性 那么为什么?jsonp方式采用的是script标签 因为script标签会将读取到的数据 当做js代码来执行

// 注意: jsonp的缺点 只能发送get请求


// jsonp的请求方式 演示:
   document.querySelector("button").onclick = function () {
     // 1、创建script标签
     let scr = document.createElement("script")
     // 2、设置好接口地址
     scr.src="http://baidu.com:8080"
     // 3、发送请求
     document.body.appendChild(script)
     // 4、外部定义fn函数拿到数据
     // 5、如何由前端定义函数名 在发送请求时 携带参数callback
     // 6、请求地址上携带参数 加一个问号即可
     // 7、"http://baidu.com:8080/jsonp?callback=fn2"
   }
// 我们通过script的src属性调用接口 会返回给我们一个fn函数 函数中携带参数 所以我们要在外部写一个fn函数 定义形参 从而获取到这个数据
   function fn(data) {
     console.log(data);
   }

cors方式

 // 注意:需要服务端进行配置 允许资源共享

 // 服务器的代码:
 // 允许所有的域名访问这个接口
    ctx.set('Access-Control-Allow-Origin', '*');
 // 允许http://www.test.com这个域名访问这个接口
    ctx.set('Access-Control-Allow-Origin', 'http://www.test.com');

Vue代理跨域

  // 代理
  devServer: {
    // 反向代理配置
    proxy: {
      '/cindasc': {
        // 其实就是通过webpack起了一个node服务代替你发送请求 要访问的跨域的api域名
        target: 'http://127.0.0.1:8000',
        ws: false, // Websocket 长连接, 太烦了 关了
        changOrigin: true, // 允许跨域
        pathRewrite: {
          '^/api': '/',
        },
      },
    },
    port: port, // 端口号
    open: true, // 禁止自动启动
    overlay: {
      // 让浏览器 overlay 同时显示警告和错误
      warnings: false,
      errors: true,
    },
  },

nginx配置代理(丢到线上时的跨域)

更改之后 ./nginx -s reload 重新加载

    server {
        #监听端口
        listen       8000;
        listen       [::]:8000;
        #服务运行地址
        server_name  localhost;
        #静态资源目录
        root   /home/web/myFrame/;
        error_page 404 /404.html;
	   location / {
	     add_header Cache-Control "no-store, no-cache, no-transform, must-revalidate, max-age=0";
		index index.html index.htm;
		#配合vue-router的history模式
#		try_files $uri $uri/ @router;
	   }
        location = /404.html {
          root  /home/web/myFrame/index.html;
        }
    
	   location /page/project/static/ {
          alias  /home/web/myFrame/static/;
        }
        error_page 500 502 503 504 /50x.html;
      
        location = /50x.html {
        }

# 这里就是代理的配置  接口转发  核心proxy_pass http 一定要带反斜杠
# 结尾无斜杠,nginx会将请求路径全部代理过去
# 结尾有斜杠,nginx会将请求路径匹配location的剔除后再代理过去
	   location / {
#          proxy_pass http://127.0.0.1:8000/;
#          proxy_redirect off;
#          proxy_set_header Host $host;
#          proxy_set_header X-Real-IP $remote_addr;
#          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#          proxy_set_header   Cookie $http_cookie;
#          # for Ajax
#          #fastcgi_param HTTP_X_REQUESTED_WITH $http_x_requested_with;
#          proxy_set_header HTTP-X-REQUESTED-WITH $http_x_requested_with;
#          proxy_set_header HTTP_X_REQUESTED_WITH $http_x_requested_with;
#          proxy_set_header x-requested-with $http_x_requested_with;
#          client_max_body_size 10m;
#          client_body_buffer_size 128k;
#          proxy_connect_timeout 90;
#          proxy_send_timeout 90;
#          proxy_read_timeout 90;
#          proxy_buffer_size 128k;
#          proxy_buffers 32 32k;
#          proxy_busy_buffers_size 128k;
#          proxy_temp_file_write_size 128k;
	   }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值