Java:我可以通过应用程序将客户端重定向到负载均衡器后面的同一 session /节点吗?

标签 java load-balancing jsessionid

我有一个网络应用程序,用户应该能够同时通过不同的客户端(即从电脑浏览器和智能手机浏览器)访问相同的 session (jsession)。

示例:

A) X 将通过他的 PC 访问系统。例如浏览http://example.com/testapp?workon=123 。服务器将创建一个新的 JSESSIONID 将其发送回客户端并存储一些值 - 例如在 session 中的“abc”。

B) 现在,同一个人 X 将从他的智能手机访问相同的 URL,并能够在后续请求中从 session 中检索值“abc”。

这不能开箱即用,因为在 B) 中客户端将获得一个新的 Session 和 JSESSIONID,这与 A) 中提供的不同。

当我现在强制服务器向 B) 提供与 A) 中相同的 JSESSIONID 时,它们都能够访问同一个 session 吗?这可能吗?

我问这个是因为我想实现以下目标:

应用程序在负载均衡器后面运行,该负载均衡器通过使用 JSESSIONID 启用了粘性 session 。

我希望在 B) 的后续请求中将 B 重定向到与 A) 相同的集群节点。

这里的请求参数“workon”只是一个例子。实际上,这是负载均衡器无法理解的 token 。只有应用程序能够理解和解码“workon”参数的内容。

B)的第一个请求去任意一个节点都是没有问题的。任何节点都可以解码“workon”参数,并向客户端提供正确的 JSESSIONID。但后续请求应重定向到与 A) 的请求相同的节点。

由于性能问题,我不想跨节点使用 session 共享。 session 数据相当大。我想根据 B) 的第一个请求将 B) 重定向到与 A) 相同的节点

有什么想法吗?

编辑以反射(reflect)评论中的问题:

在请求 A) 中,有一个请求参数“workon”,它标识映射内的某些记录。该记录包含用于安全绑定(bind)的用户和 jsessionid。因此负载均衡器无法找到请求的用户。用户未使用任何登录进行身份验证。

根据请求 B)(来自智能手机),手机在第一个请求上发送用户 ID 和 token (在 json/xml 有效负载内)。应用程序检查 token 对于该用户是否有效(再次使用某些 map ),然后找到该用户的最新“workon”并将该“workon”发送回智能手机。在随后的请求中(这些请求应该发送到与 A 相同的节点),智能手机会发送 token 和 workon 参数。

最佳答案

如果您希望节点分配在不同浏览器(如您的示例中的 PC 和移动设备)之间持续存在,则不能直接使用 JSESSION ID token

您需要进行身份验证 - 身份验证后,您在客户端上设置一个对于每个用户来说都是唯一的 cookie - 不要使用此 cookie 来检查用户是否经过身份验证:这将使您面临各种安全问题。只需确保用户登录后始终获得相同的 cookie 值

使用该 cookie 在负载均衡器中实现粘性 session 。具体会根据平衡器而变化,但大多数都应该理解cookie。

Cookie 的具体名称和内容因负载均衡器而异。 这是一个 apache 服务器的示例 Apache 负载均衡器:http://httpd.apache.org/docs/current/mod/mod_proxy_balancer.html http://www.markround.com/archives/33-Apache-mod_proxy-balancing-with-PHP-sticky-sessions.html/

这是另一个使用 haproxy 的: Load Balancing (HAProxy or other) - Sticky Sessions

请注意,对于 haproxy,您应该在配置中启用“保留”选项,以便服务器控制 cookie 内容并可以将同一用户粘到同一后端(身份验证后)

关于Java:我可以通过应用程序将客户端重定向到负载均衡器后面的同一 session /节点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24017653/

相关文章:

java - ClassFormatError - 不兼容的魔法值

JAVA 更改 JSESSIONID cookie

java - 有没有办法使用 Substance 从 JMenuBar 中删除此搜索图标和栏?

java:生成一个不在矩形内的随机点

web-applications - TCP负载平衡器和HTTP负载平衡器之间的区别以及何时使用什么?

java - 在 map reduce 中使用自定义分区程序应该遵循哪个逻辑来解决这个问题

java - 隐藏 ActionBar(定时)和动画 View

java 从命令行导入包

web-applications - 您如何构建像 Firebase 这样的应用程序?

java - Servlet 容器如何管理组成的 jsessionid?