iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >关于后端如何解决跨域的问题说明
  • 662
分享到

关于后端如何解决跨域的问题说明

2024-04-02 19:04:59 662人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是跨域请求什么是同源策略同源策略限制内容有那什么又是同源?跨域解决方案1.JSONp2.cors3.@CrossOrigin注解4.使用SpringCloud网关5.node

对于跨域,相信同学们都有所了解。前端的跨域的若干种方式,大家也都知道,什么 jsONP,iframe+domain 等等。但是我们今天的主题,不是前端跨域,而是后端跨域。

一旦提及到跨域,就会想到同源策略,那我们就先来回顾跨域和同源策略。

什么是跨域请求

首先,我们要了解什么是跨域请求。简单来说,当一台服务器资源从另一台服务器(不同 的域名或者端口)请求一个资源或者接口,就会发起一个跨域 Http 请求。

举个简单的例子:

从http://aaa.com/index.html,发送一个 ajax 请求,请求地址是 http://bbb.com/下面的一个接口,这就是发起了一个跨域请求。在不做任何处理的情况下,这个跨域请求是无法被成功请求的,因为浏览器基于同源策略 会对跨域请求做一定的限制。那什么又是同源策略呢?

什么是同源策略

首先大家要知道同源策略发生的场景——浏览器中,什么意思呢?如果不是浏览器的话, 就不会受到同源策略的影响。也就是说,两个服务器直接进行跨域请求是可以进行数据请求的。这也就为我们接下来的后端跨域埋下一下小伏笔。 同源策略的目的是什么呢?同源策略限制了从同一个源加载的文档或者脚本如何与来自另 一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。

同源策略限制内容有

  • Cookie、LocalStorage、IndexedDB 等存储性内容
  • DOM 节点
  • AJAX 请求不能发送

那什么又是同源?

大家都知道,一个域名请求地址的组成是:协议+域名+端口号+请求资源地址 , 当协议、域名、端口号中任意一个不相同时 , 都算作不同源(必须是域名完全相同,比如说 a.example.com 和 b.example.com 这两个域名。

虽然它们的顶级域名和二级域名(均为 example.com)都相同,但是三级域名(a 和 b)不相同,所以也不能算作域名相同)。

如果不同时满足这上面三个条件,那就不符合浏览器的同源策略。 需要注意的是,不是所有的交互都会被同源策略拦截下来,下面两种交互就不会触发同源策略: 

跨域写操作(Cross-origin writes)

  • 例如超链接、重定向以及表单的提交操 作,特定少数的 HTTP 请求需要添加预检请求(preflight)

跨域资源嵌入(Cross-origin embedding)

  • <script> 标签嵌入的跨域脚本; o <link> 标签嵌入的 CSS 文件; o <img> 标签嵌入图片;
  • <video> 和 <audio> 标签嵌入多媒体资源; o <object>, <embed>, <applet> 的插件
  • @font-face 引入的字体,一些浏览器允许跨域字体(cross-origin fonts),一些需要同源字体(same-origin fonts);
  • <frame> 和 <iframe> 载入的任何资源,站点可以使用 X-FrameOptions 消息头来组织这种形式的跨域交互。

这里你或许有个疑问:请求跨域了,那么请求到底发出去没有?

跨域并不是请求发不出去,请求能发出去,服务端能收到请求并正常返回结果,只是结果被浏览器拦截了。

你可能会疑问明明通过表单的方式可以发起跨域请求,为什么 Ajax 就不会?因为归根结底,跨域是为了阻止用户读取到另一个域名下的内容,Ajax 可以获取响应,浏览器认为这不安全,所以拦截了响应。但是表单并不会获取新的内容,所以可以发起跨域请求。

同时也说明了跨域并不能完全阻止 CSRF,因为请求毕竟是发出去了。

跨域解决方案

跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果。方法有很多 ,大致分为两类:

  • 服务端进行设置默认允许某些域名跨域访问
  • 从客户端入手想办法绕开同源安全策略

常见的解决方案有:

1.jsonp

利用 <script> 标签没有跨域限制的漏洞,网页可以得到从其他来源动态产生的 JSON 数据。JSONP请求一定需要对方的服务器做支持才可以。

JSONP和AJAX相同,都是客户端向服务器端发送请求,从服务器端获取数据的方式。但AJAX属于同源策略,JSONP属于非同源策略(跨域请求)

JSONP优点是简单兼容性好,可用于解决主流浏览器的跨域数据访问的问题。缺点是仅支持get方法具有局限性,不安全可能会遭受XSS攻击。

2.cors

CORS(Cross-origin resource sharing),跨域资源共享。CORS 其实是浏览器制定的一个规范,浏览器会自动进行 CORS 通信,它的实现则主要在服务端,它通过一些 HTTP Header 来限制可以访问的域,例如页面 A 需要访问 B 服务器上的数据,如果 B 服务器 上声明了允许 A 的域名访问,那么从 A 到 B 的跨域请求就可以完成。对于那些会对服务器数据产生副作用的 HTTP 请求,浏览器会使用 OPTIONS 方法发起 一个预检请求(preflight request),从而可以获知服务器端是否允许该跨域请求,服 务器端确认允许后,才会发起实际的请求。在预检请求的返回中,服务器端也可以告知客 户端是否需要身份认证信息。我们只需要设置响应头,即可进行跨域请求。

虽然设置 CORS 和前端没什么关系,但是通过这种方式解决跨域问题的话,会在发送请求时出现两种情况,分别为简单请求和复杂请求。

简单请求:

只要同时满足以下两大条件,就属于简单请求:

1)使用GET、HEAD、POST方法之一;

2)Content-Type 的值仅限于:text/plain、multipart/fORM-data、application/x-www-form-urlencoded,请求中的任意 XMLHttpRequestUpload 对象均没有注册任何事件监听器; XMLHttpRequestUpload 对象可以使用 XMLHttpRequest.upload 属性访问;

复杂请求:

不符合以上条件的请求就肯定是复杂请求了。 复杂请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求,该请求是 option 方法的,通过该请求来知道服务端是否允许跨域请求。

我们用PUT向后台请求时,属于复杂请求,后台需被请求的Servlet中添加Header设置,Access-Control-Allow-Origin这个Header在W3C标准里用来检查该跨域请求是否可以被通过,如果值为*则表明当前页面可以跨域访问。默认的情况下是不允许的。

一般我们可以写一个过滤器: 

@WEBFilter(filterName = "corsFilter", urlPatterns = "
        corsConfiguration.setAllowCredentials(true);
        
        corsConfiguration.addAllowedOrigin("*");
        
        corsConfiguration.addAllowedHeader("*");
        
        corsConfiguration.addAllowedMethod("*");
        urlBasedCorsConfigurationSource.reGISterCorsConfiguration("/**", corsConfiguration);
        return new CorsFilter(urlBasedCorsConfigurationSource);
    }
}

或者使用WebmvcConfigurationSupport,实现方式有很多,感兴趣的可以自行研究。

3.@CrossOrigin注解

这个方法仅对Java有用。SpringBoot中,在Controller类上添加一个 @CrossOrigin(origins ="*") 注解就可以实现对当前controller 的跨域访问了,当然这个标签也可以加到方法上,或者直接加到入口类上对所有接口进行跨域处理,注意这个注解只在jdk1.8版本以上才起作用。

4.使用springCloud网关

服务网关(zuul)又称路由中心,用来统一访问所有api接口,维护服务。

spring cloud Zuul通过与Spring Cloud Eureka的整合,实现了对服务实例的自动化维护,所以在使用服务路由配置的时候,我们不需要向传统路由配置方式那样去指定具体的服务实例地址,只需要通过Ant模式配置文件参数即可

5.Node中间件代理(两次跨域)

实现原理:同源策略是浏览器需要遵循的标准,而如果是服务器向服务器请求就无需遵循同源策略。这样的话,我们可以让服务器替我们发送一个请求,请求其他服务器下面的数据。然后我们的页面访问当前服务器下的接口就没有跨域问题了。 

代理服务器,需要做以下几个步骤:

  • 接受客户端请求 。
  • 将请求 转发给服务器。
  • 拿到服务器 响应 数据。
  • 将 响应 转发给客户端。

6.nginx反向代理

实现原理类似于Node中间件代理,需要你搭建一个中转nginx服务器,用于转发请求。

使用nginx反向代理实现跨域,是最简单的跨域方式。只需要修改nginx的配置即可解决跨域问题,支持所有浏览器,支持session,不需要修改任何代码,并且不会影响服务器性能。

实现思路:通过nginx配置一个代理服务器做跳板机,反向代理访问domain2接口,并且可以顺便修改cookie中domain信息,方便当前域cookie写入,实现跨域登录。

将nginx目录下的nginx.conf修改如下:

// proxy服务器
server {
    listen       81;
    server_name  www.domain1.com;
    location / {
        proxy_pass   http://www.domain2.com:8080;  #反向代理
        proxy_cookie_domain www.domain2.com www.domain1.com; #修改cookie里域名
        index  index.html index.htm;
 
        # 当用webpack-dev-server等中间件代理接口访问nignx时,此时无浏览器参与,故没有同源限制,下面的跨域配置可不启用
        add_header Access-Control-Allow-Origin http://www.domain1.com;  #当前端只跨域不带cookie时,可为*
        add_header Access-Control-Allow-Credentials true;
        add_header Access-Control-Allow-Methods GET, POST, OPTIONS;
        add_header Access-Control-Allow-Headers *;
    }
}

这样我们的前端代理只要访问 http:www.domain1.com:81/*就可以了。

总结

  • CORS支持所有类型的HTTP请求,是跨域HTTP请求的根本解决方案
  • JSONP只支持GET请求,JSONP的优势在于支持老式浏览器,以及可以向不支持CORS的网站请求数据。
  • 不管是Node中间件代理还是nginx反向代理,主要是通过同源策略对服务器不加限制。
  • 日常工作中,用得比较多的跨域方案是cors和nginx反向代理

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

--结束END--

本文标题: 关于后端如何解决跨域的问题说明

本文链接: https://www.lsjlt.com/news/166356.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 关于后端如何解决跨域的问题说明
    目录什么是跨域请求什么是同源策略同源策略限制内容有那什么又是同源?跨域解决方案1.jsonp2.cors3.@CrossOrigin注解4.使用SpringCloud网关5.Node...
    99+
    2022-11-13
  • java后端解决跨域的几种问题解决
    1.java过滤器过滤 允许整个项目跨域访问,可通过filter来进行过虑: public class SimpleCORSFilter implements Filter{ ...
    99+
    2022-11-11
  • 如何解决VueJs前后端分离跨域问题
    这篇文章给大家分享的是有关如何解决VueJs前后端分离跨域问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用vue-cli搭建的vue项目可以使用在项目内设置代理(proxy...
    99+
    2022-10-19
  • springboot解决前后端分离时的跨域问题
    目录一、为什么会跨域? 二、什么是跨域? 三、处理跨域 1、在controller的类上或方法上添加注解 2、在启动类配置全局cors(springboot2.0已经过时)3、注册c...
    99+
    2022-11-12
  • Java跨域问题的几种后端解决方式
    文章目录 Java跨域问题解决方式一、什么是跨域二、常见跨域举例三、Java后端解决方式1、实现 WebMvcConfigurer2、实现 HandlerInterceptor3、使用Filt...
    99+
    2023-09-29
    java 开发语言 servlet intellij-idea gateway
  • 分享后端解决跨域问题的三种方案
    1.跨域的介绍 跨源资源共享(CORS——Cross-Origin Resource Sharing,跨源资源共享,或通俗地译为跨域资源共享)是一种基于 HTTP 头的机制,该机制通过允许服务器标示除了它自己以外的其它源(域、协议或端口)...
    99+
    2023-09-01
    spring boot 网络 java Powered by 金山文档
  • vue-cli开发时如何解决关于ajax跨域的问题
    这篇文章主要介绍vue-cli开发时如何解决关于ajax跨域的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!目的:使用vue-cli构建的项目,在开发时,想要访问后台接口获取数据...
    99+
    2022-10-19
  • 如何在前端中解决跨域问题
    如何在前端中解决跨域问题?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是跨域?跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的。广义的跨域:1.)&...
    99+
    2023-06-15
  • springboot怎么解决前后端分离时的跨域问题
    这篇文章主要介绍springboot怎么解决前后端分离时的跨域问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!springboot是什么springboot一种全新的编程规范,其设计目的是用来简化新Spring应用...
    99+
    2023-06-14
  • SpringCloud zuul 网关如何解决跨域问题
    跨域 在SpringCloud中 zuul 和springboot 要同时配置才能实现网关处理跨域 解决Access to XMLHttpRequest at ‘http://19...
    99+
    2022-11-12
  • Nginx如何解决前端跨域问题以及CORS跨域配置
    Nginx如何解决前端跨域问题以及CORS跨域配置,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Nginx的CORS配置,网上太多这配置了,但大家更多的复制粘贴...
    99+
    2023-06-04
  • web前端网络跨域问题如何解决
    今天小编给大家分享一下web前端网络跨域问题如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是跨域浏览器有一个重要...
    99+
    2023-07-02
  • 如何解决vue2中前后端分离项目ajax跨域session的问题
    这篇文章将为大家详细讲解有关如何解决vue2中前后端分离项目ajax跨域session的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。实现跨域请求时,每次ajax请求...
    99+
    2022-10-19
  • gateway网关与前端请求跨域问题的解决方案
    gateway网关与前端请求的跨域问题 最近因项目需要,引入了gateway网关。可是发现将前端请求的端口指向网关后,用postman发送请求是正常的,用浏览器页面点击请求会出现跨域...
    99+
    2022-11-12
  • Ajax的跨域问题如何解决
    今天小编给大家分享一下Ajax的跨域问题如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。跨域问题如图所示,这是通过jq...
    99+
    2023-06-29
  • vue如何解决axios请求前端跨域问题
    目录前言一、为什么会出现跨域的问题?二、解决方案跨域资源共享(CORS)写在最后前言 最近在写纯前端的vue项目的时候,碰到了axios请求本机的资源的时候,出现了访问报404的问...
    99+
    2022-11-12
  • SpringBoot前后端分离解决跨域问题的3种解决方案总结
    目录什么是跨域跨域问题的解决策略三种解决方法总结什么是跨域 想要知道什么是跨域的话,我们可以通过一个小案例简单了解一下跨域的概念:在项目代码编写的时候,我们将前端项目代码和后端的项目...
    99+
    2022-11-13
  • 前端vue打包项目,如何解决跨域问题
    目录vue打包项目解决跨域vue项目解决跨域(打包上线无需手动切换url)vue打包项目解决跨域 前段时间做一个vue打包成安卓和IOS的App,遇到了跨域问题,直接拿了之前项目的配...
    99+
    2022-11-13
  • 如何解决angular.js跨域post的问题
    这篇文章将为大家详细讲解有关如何解决angular.js跨域post的问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。跨域,前端开发中经常遇到的问题,AngularJS...
    99+
    2022-10-19
  • web中如何解决跨域的问题
    这篇文章主要为大家展示了“web中如何解决跨域的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“web中如何解决跨域的问题”这篇文章吧。什么是跨域?概念如下:只要协议、域名、端口有任何一个不同...
    99+
    2023-06-08
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作