多个服务器如何通过维护相同的用户会话来处理 Web 应用程序请求。?

Posted

技术标签:

【中文标题】多个服务器如何通过维护相同的用户会话来处理 Web 应用程序请求。?【英文标题】:How web application request is handled by multiple servers by maintaing the same user session.? 【发布时间】:2013-04-20 05:41:55 【问题描述】:

想知道维护同一用户会话的多个服务器如何处理请求。

例如:我们登录 IRCTC 并尝试订票。 在付款过程中,IRCTC 列出了多个带有单选按钮的银行选项,用于在线交易。假设我决定使用花旗银行进行交易,当我点击花旗银行单选按钮时,我将被重定向到花旗银行网站交易页面,即您将看到 URL 从 IRCTC 网站切换到花旗银行 URL。这意味着我完全退出 IRCTC 并切换到 CITI BANK 网站。现在,当我的支付交易完成时,我从 CITI 银行网站切换回 IRCTC 网站不结束用户会话,即当我在完成交易后从 CITI 银行 URL 切换回 IRCTC 时,用户会话是保持登录状态。

我想知道这是如何工作的。

    如何从 IRCTC 向 CITI 银行网站发送请求 CITI Bank 服务器如何从 IRCTC 接收详细信息 相同的请求如何从 CITI 银行返回到 IRCTC 即服务器如何切换(从 CITI 银行到 IRCTC) 在通信过程中如何在两个不同的服务器之间维护相同的用户会话,即当付款交易完成后从 CITI 银行返回到 IRCTC 的请求时,IRCTC 将显示用户为登录用户。 在两台服务器之间切换时如何保持相同的用户会话?

我正在使用 Struts 框架。请在这方面帮助我,并通过一些示例来实现。

假设 IRCTC 使用 struts (Jsp/Servlets),struts 组件负责将 IRCTC 的详细信息发送给 Citi 银行,并将 CITI 银行的详细信息返回给 IRCTC。是否可以使用 Requestdispacter.sendRedirect() 或其他东西?

谢谢,

阿南德

【问题讨论】:

【参考方案1】:

有一个东西叫session replication。它在集群中用于让所有集群节点使用相同的会话信息。如果您好奇,请阅读链接站点或其他资源,了解会话复制的工作原理。

但系统不需要共享整个会话对象。在您的情况下,您似乎要离开一台服务器,然后在没有任何特殊会话处理的情况下返回。会议从未关闭。就像您登录到您最喜欢的网络邮件站点一样,然后移动到一个完全不同的页面并返回您的网络邮件站点。会话仍然存在。您仍处于登录状态。

因此,IRCTC 站点可能会将一些信息传递给 CITI 银行站点,CITI 需要这些信息以及令牌(在最简单的情况下只是一个数字)来处理请求。当 CITI 银行完成后,它会使用结果代码和令牌调用 IRCTC 服务器。使用令牌,IRCTC 服务器可以将结果代码与您的会话相关联。然后花旗银行只是将您的浏览器重定向到 IRCTC 页面。那里的服务器有一个更新的会话,可以在您的订单流程中向您显示下一页。

【讨论】:

我不认为支付网关维护来自不同银行的个人用户会话.... @Eduard,在这种情况下,它不可能是会话复制,因为 IRCTC 和 CITIBANK 是不同的组织,所以它们不能有会话复制。 以上2个cmets是对的。但是,还是谢谢你的replication概念。学习了。 谢谢大家。但不幸的是,我们没有使用 Web 服务,也没有处于集群环境中。我正在使用 struts 应用程序。我的一位同事建议使用 Requestdispacther.sendredirect()。你们能否帮助我了解是否真的可以使用 Requestdispacther.sendredirect() 实现从一台服务器到另一台服务器的请求切换。我恳请您帮助我提供一些示例代码。 @anandkumar 不,不可能使用 requestdispatcher 将请求发送到另一个 URL,因为它需要资源的相对路径。不过,您可以在另一个 URL 上提交表单。请参阅下面的答案。【参考方案2】:

这里 IRCTC 和 CITI 银行之间没有共享会话。 IRCTC 通过 CITI 银行 url 上的表单提交向 CITI 银行提出请求,付款金额和其他内容作为隐藏参数在该表单中发送(当然,通过安全机制,例如发送值的一些哈希码)。

支付成功后,花旗银行会向IRCTC URL提交表单(返回IRCTC给出的url)。在隐藏参数中包含详细信息(如成功/错误)。 IRCTC 处理并显示成功/错误屏幕。

此外,在这种情况下,您的父应用程序中的会话永远不会被终止。会话可以通过以下方式之一结束:

 1. Session time out
 2. Logout
 3. Application destroys the session

在这种情况下,这一切都没有发生,用户会话仍然存在于浏览器和应用程序中。

如果应用程序有多个服务器,则使用服务器提供的会话复制机制在它们之间共享会话。

此外,Web 服务器请求同一台服务器(用于会话 id)并且仅在原始服务器无法访问时调用另一个应用程序服务器,在这种情况下会话复制可以拯救用户。

【讨论】:

假设 IRCTC 使用 struts (Jsp/Servlets),struts 组件负责将 IRCTC 的详细信息发送到 Citi 银行并从 CITI 银行接收回详细信息给 IRCTC。是否可以使用 Requestdispacter.sendRedirect() 或其他东西? @anandkumar:不要将自己与技术混淆。如前所述,requestdispatcher 仅适用于相关资源,例如应用程序中的 jsp。出于您的目的,您将必须创建一个带有表单的 jsp,其中表单操作将是支付网关 url(由支付网关提供,在向它们注册时),它将包含隐藏参数,其中包含付款等详细信息,商家id等。表单提交是html提供的,不要和struts混淆,这种情况下,表单提交不会是你的struts动作,而是直接到支付网关。【参考方案3】:

你怎么能说两个服务器中的用户会话是相同的?

我假设您在谈论支付网关选项及其功能。

通常发生的情况是您发送 Web 服务调用并将用户重定向到支付网关的 URL,该 URL 将处理交易详细信息。

然后,原始银行会收到包含交易详细信息的支付网关 Web 服务响应。

不过,此流程在不同网关上略有不同。然而,最重要的是他们不会在他们的服务器上为您的用户维护会话,如果他们维护会话,那么它将为 IRCTC 网站。

【讨论】:

【参考方案4】:

有一种叫做会话迁移的东西,其中一个 LBS(负载平衡服务器)可用于获取多个请求并与多个应用程序服务器联系。有时一个用户请求可能会被多个用户请求同一事物的多个服务器共享。显然,请求所在的服务器必须是免费的。然后 LBS 接受第一个请求并转发到为该用户创建会话 obj 的免费服务器。现在第二个请求被转发到第二个服务器。但是第二台服务器想要共享第一个用户会话 Obj,因此我们必须从会话 1 迁移到会话 2。它有两个事件,将发生钝化事件和激活事件。我们必须使用一个监听器 HttpSessionActivationListener 并且必须实现 void sessionWillPasivate() 和 void sessionDidActivate()

【讨论】:

以上是关于多个服务器如何通过维护相同的用户会话来处理 Web 应用程序请求。?的主要内容,如果未能解决你的问题,请参考以下文章

JAX-WS 客户端:跨多个服务维护会话/cookie

如何从多个服务器获取与 Spring Security 和 Spring Session 相同的会话

删除 Worklight Adapter 中的 Cookie:多个会话使用基于相同适配器的身份验证

PHP面试 PHP基础知识 八(会话控制)

Spring Security 使用 JDBC 会话在多个 Web 应用程序之间共享相同的会话

硒;如何运行多个实例并维护不同的会话