首页 > 解决方案 > 将旧版 Spring MVC + JSP 应用程序与 Angular 应用程序一起运行是个好主意吗?

问题描述

我们要求仅将旧系统的一部分迁移到 Angular 8 应用程序。

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

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

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

以前有没有人有过这个问题?你是怎么解决的?您是否建议完全迁移到 Angular?

标签: javaangularspring-mvcjsp

解决方案


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

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

如果您需要共享状态(除了身份验证),那么您将需要在 JSP 容器中实现一个 API,以便 Angular 应用程序可以检索状态并对其进行修改。您可能会发现只有一小部分状态需要共享。

对于身份验证,最简单的设置是 Angular App 是否可以使用会话 cookie 访问所有 API。然后你不需要做任何事情。不需要新的身份验证页面,也不需要传递 JWT。

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


推荐阅读