当前位置: 首页 > news >正文

后端跨域问题解决方案_打破ajax 跨域问题,游刃有余的解决方案,大神就是这样操作的...

3c0ebf8801d08e736f7be996fe78b5eb.png

什么是 ajax 跨域

主流的前后端分离模式下,当前端调用后台接口时,由于是在非同一个域下的请求,从而会引发浏览器的自我安全保护机制,最终结果是接口成功请求并响应,但前端不能正常处理该返回数据

因此,当同时满足以下三个条件的情况下,就会出现跨域问题:

  1. 浏览器限制
  2. 非同源请求(跨域)
  3. 发送的是 XHR ( XMLHttpRequest ) 请求

解决方案

795b0845ba7cef76280751aa47961f33.png

想要彻底解决跨域问题,只需要破坏以上三个条件的任一即可:

1. 修改浏览器(不推荐)

添加浏览器启动参数:chrome --disable-web-security,但是极不推荐这种解决方式。

2. JSONP请求(不常用)

Jsonp,全称 JSON with Padding,一种非官方的协议,而是一种约定;前端通过向后台发送 script 类型请求解决跨域,此时接口响应的 application/javascript 类型的数据会作为 callback 函数的参数进行处理。

所以,后台也需要做相应的处理。以 Java 为例,添加如下配置即可:

@ControllerAdvicepublic class JsonpAdvice extends AbstractJsonpResponseBodyAdvice { public JsonpAdvice() { // 前后端约定的jsonp参数名,默认值是callback super("callback"); } }

注意,Spring 4.1 版本之后,官方已不再推荐使用上述允许 jsonp 请求的配置,建议使用 CROS 配置来解决跨域问题,详情可查看这里

综上,jsonp 请求存在以下几个弊端:

  1. 服务端需要改动代码进行支持;
  2. 只支持发送 Get 请求,请求头中更改其它类型的请求方式是无效的;
  3. 发送的不是 XHR 请求,而是 script 类型,无法享受到相关的特性。

3. 调用方隐藏跨域

用 Nginx 或 Apache 来代理调用方的请求(客户端变更为相对路径请求,而非绝对路径),此时对于浏览器来说,由于请求是同源的,因此就不存在跨域问题。

4. 被调用方允许跨域(最常用)

  • 服务端配置

以 Java 应用为例,添加如下全局配置:

@Configurationpublic class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") // 允许跨域的接口 .allowedOrigins("*") // 允许跨域的请求源 .allowedMethods("*") // 允许跨域的请求方式 .allowedHeaders("*") // 允许跨域的请求头 .allowCredentials(true) // 带cookie请求的时候需要开启,且allowedOrigins需要指定为具体的请求源(最好是动态配置) .maxAge(60 * 60 * 24); // 设定options请求预检命令的缓存时长 }}

如果只想针对某个类下的接口,或者是某个具体的接口配置允许跨域,只需要在相应的地方添加注解 @CrossOrigin 即可。

  • Nginx 配置

如果配置了 nginx 作为代理服务器,那么只需要为 nginx 添加支持跨域请求即可:

 server { listen 80; server_name xxx.com; location / { proxy_pass http://localhost:8080/; # 配置允许跨域 add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Methods *; add_header Access-Control-Allow-Headers $http_access_control_request_headers; add_header Access-Control-Max-Age 3600; add_header Access-Control-Allow-Credentials true;  # 对于options预检请求,直接响应200 if ($request_method = OPTIONS) { return 200; } } }

扩展思考

10deca82e8e75482be04833b46a93acb.png

Q1:浏览器在执行跨域请求时,是先执行后判断,还是先判断后执行?
A1:都有可能,这需要根据所发送的请求是简单请求还是非简单请求来判断;如果是非简单请求,浏览器每次在执行真正的请求之前,还会先发送一个 options 请求方式的预检命令【 可设定缓存时长,取消每次请求都要预检,提高效率,参考上面的服务端配置 】。关于两种请求的区分及定义,参考下图说明:

Q2:如果是允许带(被调用方) cookie 的跨域请求,此时服务端同样配置为 Access-Control-Allow-Origin 等于 *,前端是否还可以请求成功?
A2:不可以,此时要将 Access-Control-Allow-Origin 指定为调用方具体的域【 可以先取得调用方的域再动态配置,这样就不存在多个域请求的限制问题 】,并且添加配置 Access-Control-Allow-Credentials 为 true。


喜欢小编的可以点个赞关注小编哦,小编每天都会给大家分享文章。

我自己是一名从事了多年的前端老程序员,小编为大家准备了新出的前端编程学习资料,免费分享给大家!

如果你也想学习前端,那么帮忙转发一下然后再关注小编后私信【1】可以得到我整理的这些前端资料了(私信方法:点击我头像进我主页有个上面有个私信按钮)

相关文章:

  • 对某列进行操作_使用pandas替代Excel中的繁琐操作-条件判别和loc函数使用
  • 中object转为list集合_快速带你梳理Java单列集合之Collection
  • 代码回到之前版本_代码版本控制及托管:我的最佳实践
  • springboot处理参数再转发请求_springBoot PUT请求接收不了参数的解决办法
  • 如何在EDUIS中导出ETL字幕模板_教大家Edius如何设置导出mp4格式视频
  • r语言和metawin_【R语言】关于ggcor包消息的更新
  • git maven 一键部署_Docker+Jenkins+Git+Maven实现Springboot项目自动化部署
  • 添加删除元素_蔡司:CALYPSO高级应用 | 指数交换与添加删除循环
  • 初中物理凸透镜成像动态图_只要看一眼,就能立刻知道凸透镜成像特点,中考物理必考送分题...
  • html5窗口最顶层_快速开发基于 HTML5 网络拓扑图应用——入门篇(一)
  • mime插件 node_【Node.js基础篇】(五)使用mime模块来响应css、js文件的请求
  • react前端封装接口弹出错误_在react项目中用es6封装ajax请求,组件中调用总是报错,求解?...
  • mysql5.7不能存储中文_解决Mysql5.7中文乱码的问题
  • mysql取字段中间字符串_sql 如何截取一个字段里某一字符串中间的字符?
  • mysql分区技术_高性能的MySQL(7)分区技术
  • android图片蒙层
  • Bootstrap JS插件Alert源码分析
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JavaScript类型识别
  • Java精华积累:初学者都应该搞懂的问题
  • JS函数式编程 数组部分风格 ES6版
  • JS数组方法汇总
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • Python打包系统简单入门
  • 阿里云Kubernetes容器服务上体验Knative
  • 从setTimeout-setInterval看JS线程
  • 大快搜索数据爬虫技术实例安装教学篇
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 微信小程序开发问题汇总
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 新版博客前端前瞻
  • 新书推荐|Windows黑客编程技术详解
  • 运行时添加log4j2的appender
  • 再次简单明了总结flex布局,一看就懂...
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • Prometheus VS InfluxDB
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ###项目技术发展史
  • (二)c52学习之旅-简单了解单片机
  • (算法)求1到1亿间的质数或素数
  • (转)视频码率,帧率和分辨率的联系与区别
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .libPaths()设置包加载目录
  • .net 7 上传文件踩坑
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net遍历html中全部的中文,ASP.NET中遍历页面的所有button控件
  • /var/lib/dpkg/lock 锁定问题
  • ??myeclipse+tomcat
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [2013AAA]On a fractional nonlinear hyperbolic equation arising from relative theory
  • [8481302]博弈论 斯坦福game theory stanford week 1
  • [APUE]进程关系(下)