速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

前端 DEF 部署和 BUC 接入的“跨域”坑

  • 2021-03-10
  • 本文字数:1524 字

    阅读完需:约 5 分钟

前端DEF部署和BUC接入的“跨域”坑

背景

第一次尝试 react 框架,在本地调试前端 npm start,调用后端接口采用设置 host 127.0.0.1 local-fishci2.alibaba.net,前端代码配置如下可完美解决本地跨域问题。


null


因为是自建平台且只需要部署 daily 环境,通过 def 部署前端工程后,遇到了 HTTP 和 HTTPS 协议不匹配,因为 def 部署后是 https 的,而我的服务端工程部署在 daily 环境默认都是 http 的。一开始以为是协议问题,但也没打算部署到线上环境,那样成本太大。最后发现是因为跨域了。于是“坑”就由此开始了.....


null


截止目前还是有个巨坑,对一只好无前端专业功底的小菜鸡的我来说太难了,希望能有同学能帮忙答疑解决一下。

跨域遇到的坑

坑一:This request has been blocked:the content must be served over HTTPS.

问了开发,告诉我如果解决跨域也就自然解决该问题了,这样的 block 是浏览器行为,无法提供服务端设置 Access-Control-Allow-Origin 解决问题。


解决方案:把页面拷贝到后端工程。


一开始以为迁移那么多页面和资源任务非常繁重,最后发现不需要。因为 react pc 代码多为单页面应用,只需要拷贝以下代码放到后端的 template 的目录 index.html 里。


null


null

后台 Controller 加一个页面跳转即可:

null

坑二:跳转到的不是页面,是个字符串


null

于是尝试了加静态资源的路径配置:spring.resources.static-locations=classpath:/templates/,依然保持原样

null


再次尝试修改 addResourceHandlers 方法,依然没用


null

解决方案:需要增加这种 thymeleaf 模板类型的依赖,就能跳转到 index 页面了。


null


3、坑三:因为是服务端公用的,不想占用 index 路径,想前面增加一层目录/fyapp/,切换到已有的 FyAppController 类中增加了跳转,又变成“index”字符串了。

找了很多资料和原因,尝试了各种解决方案,一直怀疑是目录层级多了一层的关系,最终找到了一个巨坑:**@RestController 注解**


解决方案:去掉 @RestController 注解改成 @Controller


之前没注意到这个注解,因为接口返回 json 都使用习惯了,但是**@RestController 是 @ResponseBody 和 @Controller 的结合体。(坑二那边是因为新建的 Controller 没有使用这个注解)** ** 这下相当于页面和资源都融合在服务端代码里了,访问服务端的域名就顺利访问了!这样一通操作下来,前端还是可以用之前的 host 域名来调试,访问的是本地静态资源,服务端页面引用的是 cdn 上的资源,也没有太大关系。

BUC 接入再遇跨域问题

尝试接入了集团的 buc,这样一来再使用前端的 host 绑定域名就直接报错:


null


看接口返回应该是从 HTTPS 到 HTTP 发生了安全降级,尝试了很多方法都无解。


null


最后只能通过服务端的域名进行本地调试,但是服务端引用的是 cdn 上的资源,本地改了前端代码,不能生效,这对于本地调试来说是阻塞性的问题。


临时解决方案:


(1)在服务端判断域名,来路由本地或 cdn 上的资源


null


index.html 引用资源一定要加上“crossorigin”,即允许前端资源被跨域访问,否则 localhost 无法访问 local-fish2.alibaba.net。

(2)安装 chrome 插件:Switcheroo Redirector,配置 host 映射。(效果等同于(1))

遗留问题:

前端 react 工程是 lazy 懒加载机制打包的,这样可以减少上传时候的包体积,于是有些资源是动态生成不可控制,依然存在动态生成的静态资源如 8.css,8.js 路径是服务端域名,本地无法访问。


null

导致页面报错:

null

笨办法:

备份一个路由文件,本地调试的时候选用去掉懒加载的方案,上传到 def 进行部署时,切换回来。但是每次这样来回改文件名也非常痛苦。


null

感想

  • 没有真正意义上的“前后端分离”。要么就是资源和页面都在服务端,要不就是页面在服务端,资源在 cdn 上。

  • “跨域”无处不在。前端访问后端会遇到,后端调前端资源也会遇到,问题展现的形式真是多种多样啊~ 希望有牛人能帮忙指点或一起参与讨论。


本文转载自:闲鱼技术(ID:XYtech_Alibaba)

原文链接:前端DEF部署和BUC接入的“跨域”坑

2021-03-10 14:001960

评论 1 条评论

发布
用户头像
我们的解决方法是在前端用 nginx 转发
2021-03-11 00:25
回复
没有更多了
发现更多内容

test1

靠谱哥

音视频实战(6)- RTSP媒体协议流的录制方案及其覆盖策略详解

liuzhen007

音视频 5月日更 签约计划第二季

【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

牧小农

JVM

抱歉,“行业毒瘤”这个锅,低/无代码不背

陈思

低代码 无代码 低代码平台 无代码平台

微服务转型系列4:理念指导实践,厘清微服务建设的主要内容和顺序

BoCloud博云

微服务

51CTO熊平:HarmonyOS是大势所趋

科技汇

🕋【Redis干货领域】彻底走进主从架构的世界(入门篇)

洛神灬殇

主从同步 Redis 核心技术与实战 5月日更 Redis系列专题 原理篇

iOS 面试策略之语言工具-Xcode使用

iOSer

ios xcode 语言 & 开发

聊聊人像抠图背后的算法技术

华为云开发者联盟

hilens 抠图 工程 抠图算法 baseline

单片机I/O控制方式(UART中断和DMA中断的区别)

不脱发的程序猿

嵌入式 单片机 GPIO的原理、特性 单片机I/O设备的控制方式

Fluid 进入 CNCF Sandbox,加速大数据和 AI 应用拥抱云原生

阿里巴巴云原生

人工智能 容器 云原生 调度 弹性计算

python str模块

若尘

Python编程 str 5月日更

Flink+Clickhouse构建实时数仓的最佳实践

Wping

大数据 flink 实时数仓 Clickhouse

百信银行基于 Apache Hudi 实时数据湖演进方案

Apache Flink

大数据 flink

Java开发5年,我为什么选择从蚂蚁金服离职?浅谈经历和经验!

Java架构追梦

Java 架构 面试 蚂蚁金服 经历分享

雀食蟀!Java Netty实战入门

北游学Java

Java Netty 网络 框架

GitHub开源:狗屁不通文章生成器

不脱发的程序猿

GitHub 开源 狗屁不通文章生成器

Golang command source code

escray

学习 极客时间 Go 语言 5月日更

灵魂拷问:后端业务开发要会用 K8s 到什么程度?

阿里巴巴云原生

容器 运维 云原生 k8s 存储

双非渣硕,是如何拿到苏宁、阿里的offer的?(分享学习心得)

Java 程序员 架构 面试

SecSolar:为代码“捉虫”,让你能更专心写代码

华为云开发者联盟

代码 华为云 CloudIDE 代码安全检测 SecSolar

真实的DevOps落地,应该是这样的 ↓

BoCloud博云

DevOps 敏捷开发

KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力

阿里巴巴云原生

容器 开发者 云原生 监控 中间件

Nginx性能分析之gpreftools

运维研习社

nginx 性能分析 5月日更

华为中国生态大会2021举行在即,GaussDB将重磅发布5大解决方案

华为云开发者联盟

数据库 opengauss 华为云 GaussDB 云数据库

SpringBoot技术专题—来看看异步处理返回方案

洛神灬殇

Java WebAsyncTask 5月日更 AsyncContext DeferredResult

音视频在智能手表上的应用

anyRTC开发者

音视频 WebRTC IoT RTC

PyQt5 实现可空值的 QDateTimeEdit

一代咩神

Python PyQt QDateTimeEdit

参照STM32时钟树配置STM32CubeMX Clock Configuration(STM32L011G4U6为例)

不脱发的程序猿

单片机 STM32微控制器 时钟树 STM32CubeMX STM32时钟配置

这个好用的分布式应用配置中心,我们把它开源了

百度Geek说

分布式 大前端 服务器

华为云官网负责人明哥:我们是如何做到门面不倒,8个月挑战业界翘楚?

华为云开发者联盟

JavaScript node.js Serverless 云原生 大前端

前端DEF部署和BUC接入的“跨域”坑_大前端_闲鱼技术_InfoQ精选文章