代码之家  ›  专栏  ›  技术社区  ›  Hai Hoang

将传统的Spring MVC+JSP应用程序与Angular应用程序一起运行是个好主意吗?

  •  0
  • Hai Hoang  · 技术社区  · 4 年前

    我们请求仅将传统系统的一部分迁移到angular 8应用程序。

    资深人士建议更改JSP端的一些url,以指向新的angular应用程序,并使新应用程序的布局看起来像旧的JSP。

    最困难的部分是,我不知道如何有效地在JSP和angular之间同步状态,因为我们必须让两个客户端(JSP和angulare)看起来像一个。这包括身份验证、表单输入、导航栏状态等。。。

    关于身份验证,第一个提出的解决方案是从JSP克隆登录页面,为angular应用程序公开一个登录api,并返回一个jwt令牌。但我认为它不会很好地工作,因为我们必须在两个应用程序之间同步登录/注销状态。第二个建议的解决方案是让旧应用程序负责身份验证,并将jwt令牌附加到链接到angular应用程序的每个url。恐怕这种方法会有安全问题和网址长度限制。

    以前有人有过这个问题吗?你是怎么解决的?你建议完全迁移到角型吗?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Codo    4 年前

    对于任何已经达到一定规模的web应用程序,这种迁移是唯一的出路,因为该应用程序太大,无法立即替换。因此,必须实现新旧页面的共存。

    最简单的方法是,如果每个页面都是完全JSP或完全Angular的,即没有混合技术。正如您已经确定的那样,Angular布局需要足够接近JSP布局,以便用户将其作为一个应用程序来体验。但是,每当用户从JSP切换到Angular页面时,他/她在加载Angular应用程序和所有相关数据时都会遇到延迟。需要付出一些努力,但要足够快。

    如果你需要共享状态(除了身份验证之外),那么你需要在JSP容器中实现一个API,这样Angular应用程序就可以检索并修改状态。你可能会发现只需要共享状态的一小部分。

    对于身份验证,最简单的设置是Angular应用程序是否可以使用会话cookie访问所有API。那你什么都不需要做。不需要新的身份验证页面,也不需要传递JWT。

    如果需要JWT,最好的解决方案是设置一个负责身份验证的专用IAM(身份和访问管理)。它将实现登录页面,并发出JWT。如果未经身份验证的用户请求JSP页面,他/她将被重定向到IAM,登录并被重定向回JSP应用程序。JSP应用程序验证登录。如果同一用户稍后打开Angular页面,并且Angular页面需要访问API,则用户将首先重定向到IAM。由于IAM提供SSO功能,它将检测有效的用户会话,并立即发出JWT(或身份验证码),而不显示登录页面。在这两种情况下,都使用OAUTH 2/OIDC流。这两种情况都得到了许多框架和库的很好支持。OIDC还包括同步注销的功能。

        2
  •  1
  •   kann    4 年前

    这不是一个好主意,但遗留应用程序将面临提升和转变方法以适应新技术。我们在React中做了类似的练习。

    JSP是服务器端处理的。你打算用Angular SSR吗?在Angular客户端处理的情况下,您可以使用会话/cookie来共享用户信息,如JWT,也可以处理状态。

    我们不得不将唯一导致页面运行缓慢的问题迁移到React。我们使用Redux来表示状态。删除了整个JSP页面并开发了相应的React组件,因此api调用来自React。一些链接调用JSP页面,很少使用http会话传递数据。对于少数复杂的json数组(在提交到后端之前需要多次追加),数据存储在Redis中,由后端和任何JSP页面检索。

    整个应用程序部署为单个Spring引导战争。