请教一个前后端分离项目部署的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eric107008
V2EX    问与答

请教一个前后端分离项目部署的问题

  •  
  •   eric107008 2023-04-26 01:29:27 +08:00 1597 次点击
    这是一个创建于 950 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个前后端分离项目,前端是 React, 后端是 Spring Boot;

    部署的目标是一个 Serverless 的平台,类似 AWS AppRunner 或者DigitalOcean AppPlatform。请注意,这意味着我们无法自主控制平台的反向代理,只能以 APP 为单位部署和管理资源。这是甲方处于成本考量提出的要求。

    这个项目的特殊之处在于,Spring Boot 在提供 API 的同时,还提供了几个基于 Thymeleaf 的页面,前端的 React 在一些情况下会跳转到这个页面来。例如用户访问前端/account路径时,前端组件会跳转到由 Thymeleaf 编写的/login页面上,完成登录后,再重定向到/account。这个/account路径显然是由前端的类似react-router-dom处理的,意味着在react-router-dom看来,这个/login页面并不存在,是要显示 404 的。

    现在主要纠结的问题有两个:

    1. 这个 React 前端应该部署在哪?

      1.1 如果作为静态资源打包在 Spring Boot 中,Spring Boot 的 Controller 在返回index.html时会试图寻找这个模板,但显然时找不到的(因为并不在模板路径中),因此会报 500 错误。

      1.2 如果作为独立的一个 APP 部署在 serverless 上,意味着前后端将使用不同的域名,会涉及到跨域问题

    2. 是否有其他的方式绕过这个问题,包括但不限于:

      2.1 解决 Spring Controller 找不到index.html的问题

      2.2 更简单实惠的部署方式

      2.3 在 serverless 平台上解决跨域问题

      ...

    也许问题看起来挺蠢的,但依然感谢各位不吝赐教。

    6 条回复    2023-04-26 14:47:35 +08:00
    cslive
        1
    cslive  
       2023-04-26 09:22:05 +08:00
    这个不是问题吧,登录完之后 spring 重定向过来就行了,你看你用 google 登录本站不也是这么做的吗
    soislom
        2
    soislom  
       2023-04-26 09:26:07 +08:00
    没使用过 serverless,我的回答可能比较片面
    soislom
        3
    soislom  
       2023-04-26 09:33:22 +08:00
    抱歉,直接回车了。。。
    通过重定向的方式可以做到 /account -> /login,同理 /login -> /account 也是一样的
    eric107008
        4
    eric107008  
    OP
       2023-04-26 10:53:42 +08:00
    @cslive @soislom 非常感谢回复。我同意使用重定向的方式在 React-MVC 页面之间实现跳转,项目中也确实是这样实现的。

    目前的问题主要集中在,应该如何将 React 和一个带 MVC 页面(意味着它有自己的 html 模板和静态资源)的 Spring boot 程序打包起来部署 /无缝衔接地分离部署。如果打包起来的话,React 编译出来的静态文件应该如何集成进 Spring Boot?

    刚刚尝试了一些操作,目前发现勉强可行的是,将 React 的编译产物拷贝到 Spring Boot 的静态资源文件夹中,并将 React 编译产物中的 index.html 移动到 Spring Boot 的 html 模板文件夹中,这样 Spring Boot 打包时可以将 React 提供的 index.html 当作一个模板,以至于可以在 Controller 中返回这个 html 文件,并由 index.html 加载打包在 Spring Boot 中的静态资源。

    但这样做存在一些问题,例如:React SPA 中的路由是由`react-router-dom`管理的。这意味着在 MVC 和 React 间跳转时,双方对路由的“认知”有所不同,会导致 React 认为 404 的地方其实 MVC 是有界面的,或是 MVC 本应重定向到 React 提供的类似 /404 这样的页面却意外返回了 WhiteLableErrorPage...

    另外,我并不认为将 React 的编译产物拆开,混装进 Spring Boot 再 Build 是一个好主意,我仍然希望可以找到更优雅的方式。
    soislom
        5
    soislom  
       2023-04-26 14:47:10 +08:00
    @eric1070
    server 重定向到 react 中转 page ,再通过中转 page 隐式跳转到目标 route
    soislom
        6
    soislom  
       2023-04-26 14:47:35 +08:00
    我之前这样处理过一次
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     857 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 19:22 PVG 03:22 LAX 11:22 JFK 14:22
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86