一、前言

最近做了一个云服务相关的项目,整个系统架构:前后端彻底分离,前端采用Vue.js开发,后端采用Java开发,前后端通过接口耦合。
笔者负责后端的开发,亲身经历了前端的跨域问题,并完美解决,下面介绍解决方案。

二、问题

  1. 浏览器对javascript同源策略的限制,导致a.cn不能访问b.cn的接口和数据,因为a.cn和b.cn不同源。
  2. 什么是同源?(同域名+同端口+同协议)
#协议跨域
http://a.com
https://a.com;

#端口跨域
http://a.com:1060
http://a.com:1061;

#域名跨域
http://a.com
http://b.com;

跨域错误提示(一般都会出现上述字样。)

 login:1 Access to XMLHttpRequest at 'https://a.com/login' 
 from origin 'https://b.com' has been blocked by "CORS" policy: 
 Request header field oniontoken is not allowed by "Access-Control-Allow-Headers" in preflight response.

三、解决方案

分两种情况,一种是针对开发阶段,另一种是针对生产阶段。

3.1 开发阶段:

这时候出现跨域直接前端做个代理即可完美解决

3.2 生产阶段:

3.2.1 使用nginx代理:
除了3.1章节介绍的在前端工程配置文件里配置代理外,还需要在部署vue静态资源文件时,在nginx.conf配置文件中加上后台服务的地址和端口:

参考完整nginx.conf:
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
 
    server {
        listen       8080;   # 前端监听端口
        server_name  localhost;
        root /usr/vuejs/nginx/;  #首页地址
        index index.html;         #首页
      
	location / {
        }        
	location ~^/server1[/\w*]*$ {
           proxy_pass http://122.51.154.61:8086;
        }
	location ~^/server2[/\w*]*$ {
           proxy_pass http://122.51.154.61:8088;
        }
    }
}

  • 说明:

服务1: server1:8086
服务2: server2:8088

  • 举例:假设前端部署在122.51.154.61上,访问前端主页:
122.51.154.61:8080/index.html
  • 前端访问后台服务接口方式:
122.51.154.61:8086/server1/login
122.51.154.61:8088/server2/api/findAll

四、尾声

可能还有其他方法解决vue跨域问题,比如后端代码层面实现,代理域名实现等... 这里暂不做研究。

😁 作者:Teddy (公众号:鸡仓故事汇)
ok!到这里就大功告成,小编(Teddy)在这里先感谢大家的到来。
虽然不是太详细,小编已经很努力,给小编来个一键三连(点赞,关注,收藏),小编会越来越努力。。。

Logo

开源、云原生的融合云平台

更多推荐