Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:我可以通过应用程序将客户端重定向到负载平衡器后面的同一会话/节点吗?_Java_Load Balancing_Jsessionid - Fatal编程技术网

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

Java:我可以通过应用程序将客户端重定向到负载平衡器后面的同一会话/节点吗?,java,load-balancing,jsessionid,Java,Load Balancing,Jsessionid,我有一个webapp,用户应该能够同时通过不同的客户端(即从pc浏览器和智能手机浏览器)访问同一会话(jsession) 例如: A) 人员X将通过其PC访问系统。通过浏览进行示例。服务器将创建一个新的JSESSIONID并将其发送回客户端,并在会话中存储一些值,比如“abc” B) 现在,同一个人X将从他的智能手机访问相同的URL,并能够在后续请求中从会话中检索值“abc” 这不是现成的,因为在B)中,客户机将获得一个新会话和JSESSIONID,它与a)中提供的会话和JSESSIONID不同

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

例如:

A) 人员X将通过其PC访问系统。通过浏览进行示例。服务器将创建一个新的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参数。

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

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

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

cookie的特定名称和内容因负载平衡器而异。 下面是apache服务器的一个示例 apache负载平衡器:

这里是另一个haproxy:


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

您可以使用用户ID实现相同的功能吗?您的应用程序如何知道是X个人访问您的应用程序?