使用浏览器对我的服务进行身份验证后,我发现一个cookie集,其中包含以下密钥\值对:
JSESSIONID=40d4b01c47ddb858718291d319a1a817d3037fdc6f2c341c195a94dc6ee8e8a1.e38Lb3qTb3aKai0RbxeMahqNbN90; path=/MyService; secure
注意后缀(即在'.'之后:e34Mc3uLa3yPbO0La3aNa3eTc38Ke0)
当我使用Javaservetl的API获取会话id(javax.servlet.http.HttpSession.getId()
)时,我得到以下值
40d4b01c47ddb858718291d319a1a817d3037fdc6f2c341c195a94dc6ee8e8a1
这与我刚才提到的cookie变量值的第一部分相同!
我曾经尝试在ColdFusion(CF)上维护多个HTTP请求之间的会话(如果你不知道CF是什么,那没关系,它只是一个开发应用程序的平台),如果我将cookie变量JSESSIONID设置为我在本问题开头提到的整个值,我就无法维护会话。为了正确维护会话,我必须发送会话id的第一部分(即在"."之前)
所以我的问题是,为什么servlet API返回JSESSIONID的一部分,而从服务器返回的cookie值有一个后缀?这个后缀com来自哪里?它的用途是什么?
例如,后缀可以是服务器的主机名。或者它可以是一个随机值。它的生成、配置和意义取决于所使用的应用程序服务器,因为它不是servlet规范的一部分。
在非集群设置中,确保会话实际上属于服务器非常有用。想象一下,负载平衡设置中存在粘性会话和服务器故障。请求现在被定向到另一台服务器。理论上,这个服务器也可以有一个具有相同会话id的会话。然后用户会进入一个不属于他的会话。附加一个服务器唯一后缀使应用程序服务器无法恢复不是在同一服务器中创建的会话。
你可以在这里了解这一点:https://developer.jboss.org/message/879684其中讨论了jboss 7和wildfly 8.1之间这种行为的差异。