【问题标题】:How to transfer session from one Tomcat server to another?如何将会话从一台 Tomcat 服务器转移到另一台?
【发布时间】:2023-04-04 06:05:01
【问题描述】:

我们有一个网店的Tomcat服务器,当他/她登录时,我们需要将用户转移到另一个(安全的)服务器。这里有一个详细的解释:

1) 我们有两台 Tomcat 服务器:一台“常规”(HTTP) 和一台安全 (HTTPS)

2) 用户最初访问常规服务器

3) 当他们登录时,我们需要获取他们的登录数据,以及有关他们当前(或试图查看)的页面的信息,将其传递给安全服务器并进行实际登录;例如,未登录的用户看到产品列表,单击“购买”并显示一个弹出窗口,要求用户登录;用户输入他/她的凭据,这些凭据以及有关他想购买的产品的信息被传递到安全服务器;安全服务器接收这些信息,执行登录并向用户显示请求的产品

如何做到这一点?请注意以下几点:

1) 我们尝试过使用 cookie,但我们决定不这样做

2) 将会话持久化到数据库,然后让安全服务器获取它也不是一种选择

还有其他方法吗?我们正在考虑创建一个对象,然后将其作为 HTTP POST 参数传递,但我不确定如何做到这一点(我被赋予了完成它的任务)。

不管怎样,我们使用的技术是 Tomcat 服务器、Wicket、Spring、iBatis 和 MySQL。

提前致谢:)

【问题讨论】:

  • 我能问一下您为什么决定不使用 cookie 吗?我访问过的每个需要跨多个 Web 服务器跟踪用户会话的站点都使用了 cookie。您为用户设置了一个具有唯一 id 的 cookie,如果 cookie 存在,请在数据库中查找您的用户会话。你的第二个音符会杀死哪个。
  • 问题出在第二个注释中。我们不想使用数据库,所以我们必须保存用户的用户名、密码和他/她在 cookie 中点击的信息(或更多)。将用户名和密码保存在 cookie 中会带来安全风险……除非可以通过某种方式保护它们?
  • 不要将用户名密码保存在 cookie 中。在您的数据库中与用户的 IP 地址和用户帐户相关联的 cookie 中放置一个唯一的会话 ID。还要让 cookie 在他的浏览器会话中过期。
  • 感谢您的帮助,但我不能这样做。我们没有会话服务器,我们也不想将会话保留在应用程序使用的 SQL 服务器中。而且,由于我无法将用户名和密码保存在 cookie 中,我必须告诉非安全服务器创建一个包含所有信息的对象,然后将其传递给安全服务器。如果您对我如何做到这一点有任何想法,我将非常感激:)

标签: java tomcat wicket


【解决方案1】:

如果您想在不同的 Tomcat 实例之间共享会话,您可以将它们配置为具有会话复制的集群:http://tomcat.apache.org/tomcat-7.0-doc/cluster-howto.html

然后,您可以将 Apache HTTP 服务器配置为负载平衡器,确保 HTTP 请求发送到服务器 1,HTTPS 请求发送到服务器 2。

但是,您也可以只配置一个 Tomcat 实例(或 N 个相同的实例)来处理 HTTP 和 HTTPS,并确保使用标准(web.xml 中的...<transport-guarantee>CONFIDENTIAL</transport-guarantee>...)或特定于框架的配置进行安全访问。

【讨论】:

  • 嗨,又是我 :) 抱歉没有早点回复,我有点忙。我要补充的是:无法使用 cookie,因为非安全服务器和安全服务器将位于不同的域上。 Speck 的想法是我最喜欢的,我开始实现它,但由于它使用 cookie,我无法使用它。因此,我将尝试在网上商店设置登录表单,将其内容直接提交到安全服务器。老实说,我不知道该怎么做。到目前为止,我所做的是将我需要的所有参数“注入”到 RequestCycle...
  • ... 为此,我扩展了 RedirectRequestTarget 并尝试将请求参数插入到请求本身中。我还注意到您只能将 cookie 添加到响应中。无论如何,简而言之,一旦我到达安全服务器,参数都会丢失。如果有人对此有任何想法,再次,我想听听:)
【解决方案2】:

不确定我是否了解您想要的内容,但您可以将“弹出窗口”作为从安全应用程序提供给受保护 URL 的页面。这将导致在安全服务器上进行身份验证,您可以从那里开始。例如,如果不安全的产品页面位于 www.domain.com/browse/id1 上,则“购买”按钮将打开一个弹窗到 secure.domain.com/buy/id1,从而在传输产品时进行身份验证网址上的 id。

【讨论】:

  • 感谢各位的帮助 :) 我发现 Wicket 有一个 RedirectPage。我通过将安全服务器 URL 传递给构造函数然后执行 redirectToInterceptPage(redirectPage) 来创建它,但问题是无论我做什么,我都无法向 redirectPage 添加任何参数/属性。我似乎既不能将 RequestParameters 也不能将 PageParameters 传递给 redirectPage,然后再传递给安全服务器(它们最终都为 null)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2021-11-04
  • 2018-08-07
相关资源
最近更新 更多