有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java:我可以通过应用程序将客户端重定向到loadbalancer后面的同一个会话/节点吗?

我有一个webapp,用户应该能够同时通过不同的客户端(即从pc浏览器和智能手机浏览器)访问相同的会话(jsession)

例如:

A)X个人将通过其个人电脑访问系统。例如,通过浏览http://example.com/testapp?workon=123来进行示例。服务器将创建一个新的JSESSIONID,并将其发送回客户端,并在其会话中存储一些值,比如“abc”

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

这不是现成的,因为在B)中,客户机将获得一个新的会话和JSESSIONID,这与a)中提供的会话和JSESSIONID不同

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

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

应用程序在负载平衡器后面运行,该负载平衡器通过使用JSSessionID启用了粘性会话

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

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

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

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

有什么想法吗

编辑以反映评论中的问题:

请求时A)有一个请求参数“workon”,用于标识地图中的一些记录。此记录包含用于安全绑定的用户和jsessionid。因此,负载平衡器无法找到请求的用户。用户未使用任何登录进行身份验证

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


共 (1) 个答案

  1. # 1 楼答案

    如果希望节点分配在不同的浏览器(例如pc和手机)中保持不变,则不能直接使用JSESSION ID令牌

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

    使用该cookie在负载平衡器中实现粘性会话。具体内容将根据平衡器的不同而变化,但大多数人都应该理解cookies

    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内容,并可以将同一用户粘贴到同一后端(在身份验证后)