前后端开发中,跨域问题的前世今生

Posted 健康平安的活着

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前后端开发中,跨域问题的前世今生相关的知识,希望对你有一定的参考价值。

一 何为跨域

1.1 跨越的前世今生

所谓跨域请求就是指:当前发起请求的域月该请求指向的资源所在的域不一致,导致无法访问。
这里所有的域是指协议、域名和端口号组成的一个完整合集。同域就是指协议、域名和端口号均相同,任何一个不同都是跨域。

1.2 产生不同跨域的情况

1.3 页面查看跨越

在浏览器中,按住f12,在console中,先清空窗口,输入fetch函数,如下图:

在打开的百度网页中访问baidu.com没有问题,而去方位taobao.com,就会出现跨域

1.4 为何浏览器访问出现跨域

浏览器为了所有资源进行安全访问,采用同源策略

同源策略是用来防御来自非法的攻击,但我们不能因为防御非法的攻击就将所有的跨域都拦截掉。
1.在现代的项目中,前端的开发中,我们经常需要调用第3方的服务接口(如mock server ,fake api),这种情况下就需要进行跨域请求。
解决方法是,前端采用cors方式解决跨域。
2.在前后端分离的项目中,前端后端分别属于不同的服务器当中,在采用这种架构时候,跨域问题就存在了,解决方法就是采用反向代理的方式来解决跨域问题。

1.5 解决跨域方案

二 案例分析以及解决办法

2.1 案例描述

描述:有两套前端代码,一套前端代码为90,一套代码为91;

 那么现在在90这套代码中,访问91这套代码:将返回数据通过alert,进行输出,如下图所示:

 问题产生:出现了跨域:如下图所示:

 2.2 解决方法

2.2.1 在http响应头中加配置解决跨域

  cors是新的w3c标准,它新增的一组http首部字段允许服务器其声明哪些来源请求有权限访问哪些资源。
  这种方式最主要的特点就是毁在响应的http首部增加Access-Control-Allow-Origin等信息,从而判定哪些资源可以进行跨域请求。

Access-Control-Allow-Origin设置为*

 2.重启服务,进行访问:可以看到,已经得到了解决。

2.2.2 jsonp解决跨域

  jsonp是json的一种使用模式,可用于解决主流浏览器的跨域数据访问问题,原理就是在ajax存在跨域安全问题,但是script标签是不存在这类问题的,于是乎就有人根据这特性做了文章找了解决方案。

1.在90的index.html页面配置

 2.在91的页面修改:

 3.重启服务,访问

 https://www.bilibili.com/video/BV1Kt411E76z?from=search&seid=10667757156379129933

目录

一 何为跨域

1.1 跨越的前世今生

1.2 产生不同跨域的情况

1.3 页面查看跨越

1.4 为何浏览器访问出现跨域

1.5 解决跨域方案

二 案例分析以及解决办法

2.1 案例描述

 2.2 解决方法

2.2.1 在http响应头中加配置解决跨域

2.2.2 jsonp解决跨域

2. 3  使用nginx反向代理解决跨域

2.3.1 原理思想

2.3.2 案例描述

 2.3.3 使用nginx的反向代理解决跨域


2. 3  使用nginx反向代理解决跨域

2.3.1 原理思想

nginx做反向代理: 
1.nginx静态代理服务器要和前端页面放在一台机器上
2.前端页面得有自己的nginx,这样前端页面访问自己的nginx服务器,在同域中,就不会出现跨域。
反向代理:
  通过反向代理我们将前端和后端项目统一,通过反向代理来提供对外的服务,这样在前端看上去就跟不存在跨域一样。

2.3.2 案例描述

1.后端代码:

 2.前端代码:

 index.html代码:

<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta name="Generator" content="EditPlus®">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
  <title>Document</title>
  <script type="text/javascript" src="js/jquery-2.1.0.js"></script>
  <script type="text/javascript">
    $(document).ready(function() {
		alert(22);
    $("#btn").click(function(){
  $.get("http://localhost:8081/sgg/say",function(data){
  console.log(data);
  })
  });

    });


  </script>
 </head>
 <body>
  <a href="http://localhost:8081/sgg/say">查看</a>
  <input type="button" id="btn" value="调用后台"></input>
 </body>
</html>

 3.执行访问:

1.点击页面中的“查看”超链接

可以看到调用了后端进行了返回:

 2.点击按钮“调用后台”,执行ajax方法调用:

 总结:前后端代码均在一台机器上,通过超链接标签访问这个地  http://localhost:8081/sgg/say ,则能够成功调用后端服务进行访问。而通过ajax访问:http://localhost:8081/sgg/say 后端服务,出现跨域问题。原因在在于,协议,ip相同,而端口不相同,造成跨域。

 2.3.3 使用nginx的反向代理解决跨域

1.将前端代码放入到ngiinx中:在nginx新建一个home目录,将前端代码放进去

的是给前端代码找一个nginx,让nginx和前端代码在一个域中,然后让nginx服务器和后端代码服务器进行调用通信(服务器之间通信不会出现跨越),虽然现在前后端代码都在一台机器,我们也按照正常流程进行配置。

如下图所示:

 2.修改index.html的配置

请求地址为:http://localhost:80/api/sgg/say

 3.配置nginx的配置文件:

梳理:如果忽略跨域问题,页面访问后端的实际地址为:http://localhost:8081/sgg/say;

而为了解决跨域前端页面现在的访问路径为:http://localhost:80/api/sgg/say

这里使用nginx进行反向代理:http://localhost:80/api  ====>http://localhost:8081/

经过等量代换:http://localhost:80/api/sgg/say  ====》http://localhost:8081/sgg/say

4.进行访问:

启动nginx:

返回数据: 

 总结:可以看到完美解决跨域的问题!!!!

5.修改配置文件:将proxy_pass   http://127.0.0.1:8081;最后不加“/”,查看效果

 5.1 index.html不变

5.2 修改nginx.cnf的配置

 5.3 重新nginx

 5.4 进行访问:可以看到报404找不到路径,所以如果nginx代理之后,访问后端还有上下文访问的方法,则被代理的地址后面一定要加“/”,进行结尾。

 6.实现精准代理

6.1 修改index.html

 6.2 nginx配置文件的修改

 6.3 重启nginx

 6.4 访问:可以看到,也是ok的,这是一种比较精确的方式,只能代理访问这一个方法。

2.3.4 使用nginx的反向代理解决跨域(前端代码在tomcat中)

1.前端代码放到端口号为8080的tomcat下,修改index的配置,如下图

 2.nginx的配置

 3.启动tomcat,nginx进行访问

 

访问出现跨域:

 4.修改nginx的配置,给前端找到一个nginx代理,将nginx的80指向放前端代码的8080,将前端代码和nginx绑定:

5.重新启动nginx,进行访问:http://localhost/demo1/index.html

总结:就是要解决两个跨越问题:

1.tomcat的8080中的前端代码与nginx的80之前的跨域问题,解决就是将80端口指向tomcat的8080,二者绑定在一起,跟前面的例子将静态页面放到nginx的home目录下一样的功能。

2.tomcat页面的index.html中要访问后端:http://localhost:8081/sgg/say;同样出现跨域,解决办法

使用nginx的反向代理:http://localhost:80/api 指向http://localhost:8081/;所以index.html的页面地址就是:http://localhost:80/api/sgg/say;

 

 

以上是关于前后端开发中,跨域问题的前世今生的主要内容,如果未能解决你的问题,请参考以下文章

了解微前端,深入前端架构的前世今生

了解微前端,深入前端架构的前世今生

了解微前端,深入前端架构的前世今生

资深大牛带你了解源码!来看看移动端小程序技术的前世今生!小白也能看明白

无需CORS,用nginx解决跨域问题,轻松实现低代码开发的前后端分离

华为云Astro的前世今生:用7年时间革新低代码开发观念