Java 在与Tomcat web服务器的对话中,我应该检查JSESSIONID是否更改吗?

Java 在与Tomcat web服务器的对话中,我应该检查JSESSIONID是否更改吗?,java,tomcat,cookies,http-headers,httpurlconnection,Java,Tomcat,Cookies,Http Headers,Httpurlconnection,有一个模拟浏览器行为的Java代码。它与Tomcat服务器进行有状态对话,例如:登录、doSomething、注销 当前的实现如下所示: http post到登录页面,存储返回cookie,假设它是JSESSIONID=9845。 http post到doSomething页面,将存储的cookie JSESSIONID=9845与请求一起传递,对响应头不做任何操作,忽略进一步的cookie http进入注销页面,将存储的CookieJSessionId=9845与请求一起传递。 这很好用 但是

有一个模拟浏览器行为的Java代码。它与Tomcat服务器进行有状态对话,例如:登录、doSomething、注销

当前的实现如下所示:

http post到登录页面,存储返回cookie,假设它是JSESSIONID=9845。 http post到doSomething页面,将存储的cookie JSESSIONID=9845与请求一起传递,对响应头不做任何操作,忽略进一步的cookie http进入注销页面,将存储的CookieJSessionId=9845与请求一起传递。 这很好用

但是,我不知道在步骤2中忽略响应头是否安全。我是否应该期望服务器在会话期间更改JSESSIONID的值

换句话说,如果在第2步中出现问题,该怎么办。服务器在响应头中返回Set Cookie=[JSESSIONID=9846]

我可以想象如下:

这在现实生活中是不可能发生的,不值得检查,目前的代码还可以。 这表明Tomcat服务器存在严重问题,值得检查,代码应该停止对话,不再进行调用 这是合法的,Tomcat服务器只想为会话使用一个新的标识符,所以我必须存储新的值,并在后续调用中使用它。应完成当前代码。
我想真正的浏览器可以做到这三点。从上面的选项,但可能是1。二,。选项也是可以接受的?

通常情况下,会话在登录和注销时会发生变化,这意味着您可以期望在很大程度上是安全的,但请继续阅读,我只是典型地说。你在问忽略HTTP规范是否安全——我认为不安全,因为总是会有意外的变化,使你的应用程序难以维护或升级基础设施

其中一个很难找到的东西是:如果有一天,你开始在一个带有粘性会话的集群上部署你的应用程序,tomcat会用集群机器标记会话id,例如,你的会话标识符看起来更像9846;点头。虽然这通常不会改变,但当节点3关闭并且下一个请求重新平衡到另一个节点时,它会改变:9846;点头

如果您的登录、做某事、注销操作始终是半原子的,例如,立即相互跟踪,那么节点3在三个请求之间发生故障的概率可能可以忽略不计。如果您将会话保持打开状态一段时间,您可能希望为这样的事件提供支持


总之:忽略HTTP规范是明智的吗?不,你最有可能这样做吗:你自己决定。我举了一个例子,它可能会在未来几年咬你。你可能很容易逃脱。如果忽略规范,您的实现可能会更容易维护。但是错误将更难发现,因为这些问题在将来出现时可能看起来是随机的和罕见的,例如调试噩梦。

真正的浏览器可以做到3。tomcat是否真的会对会话重新编号是另一回事,我认为这是不可能的,除了会话无效-即注销。谢谢你,Olaf,我正是这样看的!带有会话复制的粘性会话是一种现实情况,在这种情况下,在登录后忽略JSESSIONID更改而忽略http规范是危险的。现在我有一个很好的理由来解决这个问题,谢谢!这只是本案的旁注;如果集群能够使用JSESSIONID=9845引导传入的“dosomething”请求;node3到node1在node3关闭后,我认为它将能够引导JSESSIONID=9845的进一步请求;node3也可以连接到工作节点。因此,我非常确信,客户端将能够正确地完成其会话,而不会注意到会话cookie的路由部分已更改。但是,对于会话cookie在有状态会话期间更改其值的情况,此场景始终是一个很好的示例。