如何在两个应用程序之间共享同一会话

时间:2018-03-07 09:08:44

标签: spring tomcat spring-boot redmine

我有2个应用程序:第一个是用ruby编写的(It's redmine),第二个是Spring启动应用程序,两者都托管在同一个tomcat服务器上。 我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

不允许分享会话。通过(servlet规范)定义,会话属于单个Web应用程序。

参考:Servlet Spec 4.0,第7.3节:

  

HttpSession个对象必须在应用程序(或servlet上下文)级别设置范围。底层机制(例如用于建立会话的cookie)对于不同的上下文可以是相同的,但引用的对象(包括该对象中的属性)决不能由容器在上下文之间共享。

有些方法可以通过设置共享缓存等来解决这个限制,但从安全性或资源使用角度来看,它总是很脆弱且有潜在危险。

答案 1 :(得分:0)

使用unique-user-auth-token的用户数据库或用户数据文件(nosql),可由两个应用程序访问(或3,4,5 ...)

全球概念:

  1. 应用程序请求连接:
  2. 在应用程序存储中是否存在“旧身份验证令牌”?
    • 是 - >应用程序发送旧的请求新的或相同的,如果没有过期
    • 不 - >继续
  3. 在服务器上是否存在有效的身份验证令牌?
    • 是(应用已经连接) - >将经过验证的身份验证令牌发送给应用
    • 不 - >设置新的身份验证令牌并发送到应用程序,新的AT已准备好用于其他应用程序
  4. 服务器存储应用程序请求连接并已连接
  5. 应用程序现在可以通过服务器交换数据。

答案 2 :(得分:0)

共享Web应用程序至少是Bad Practice(TM):Web应用程序完全按设计分离。如果两个应用程序都可以轻松地进入彼此的会话:想象一下如果一个人会覆盖另一个人设置的值,并且两个应用程序都期望在相同的密钥名下有不同的数据,会发生什么。

如果您只需要单点登录,则可以使用SingleSignOnValve确保您只需登录一次(前提是您通过容器进行身份验证,例如Tomcat Realm)。检查server.xml是否有注释掉的默认值,或检查文档以获取有关身份验证和阀门的更多信息。

您可以通过在两个模块中实现UI并参考常见的业务逻辑来解决这个问题,但这是一个过于宽泛的体系结构更改,无法适应这个答案。