写点什么

同域下跨应用登录问题

作者:立军
  • 2022 年 5 月 16 日
  • 本文字数:954 字

    阅读完需:约 3 分钟

背景

       厦门某银行风控系统一期(开展对公业务)已经上线,为前后端不分离的单体应用;今年要开发二期(同业和零售业务),使用 vue+rest api 前后端分离框架,要求对一期尽量少修改的情况下,2 个应用融合登录,在需要的时候可以相互嵌入对方页面。

解决方案

       将 2 个应用(其实是 3 个应用,一期应用,二期的前端和后端应用)在同一 web 容器内发布,这样就没有了跨域问题,属于同域下多应用问题。

       我们知道,每个登录用户在服务端有一个会话,通过在浏览器设置 cookie 保持这个会话。只要多应用使用同一 cookie 就能保持使用一个会话,可以相互操作。

      融合登录过程:

  1. 用户在一期登录完毕,重定向到二期前端(同域自动传递 cookie)

  2. 二期前端访问二期后端(同域自动传递 cookie)

  3. 二期后端,通过人为将 cookie 信息设置到请求头,访问一期接口

  4. 一期接口返回 cookie 对应会话里的用户名,二期后端将此用户设置为登录状态,完成融合登录。

      经分析,三个应用都要发送同一 cookie:

  1. 一期页面

每次请求都要发送 cookie 获得会话

  1. 二期的前端

虽然一期为单体应用,但也提供了部分 json api,二期 vue 前端需要直接访问一期某些接口,发送 cookie 才能获得会话

  1. 二期的后端

访问一期接口获得登录名, 发送 cookie 才能获得会话 

关键代码

       这里就上面的融合登录过程,分别介绍下配置以及代码:

 

  • 1)       配置 web 服务器,使得跨应用使用同一 session。

Tomcat7、tomcat9 需要配置:

在 Conf/context.xml 文件里,设置 sessionCookiePath:

。。。<Context sessionCookiePath="/">。。。
复制代码

 

Ibm websphere 默认 session 就是跨应用的,无需设置,其他 web 服务器参照对应手册。

  • 2)       前端 vue 默认不传递 cookie,需要设置 axios 的 withCredentials 传递 cookie


通过浏览器 F12 监视网络请求,可以看到,cookie 发送了 JSESSIONID(JSESSIONID 对应后端的会话)。



  • 3)       二期后端,通过复制二期前端的请求头(主要是 cookie 等)到请求一期的请求头,访问一期接口


       综上所述,设置前端 vue 的 withCredential 发送传统应用维持会话所需的 cookie,后端再人为复制前端的请求头来访问传统应用接口,这样在前后端分离框架和单体应用融合时,不管前端还是后端都可以和单体应用保持一个会话,从而可以融合登录以及相互融合/嵌入对方页面。

用户头像

立军

关注

还未添加个人签名 2018.12.27 加入

还未添加个人简介

评论

发布
暂无评论
同域下跨应用登录问题_混合应用开发_立军_InfoQ写作社区