java - 在与 Tomcat Web 服务器的对话期间,我应该检查 JSESSIONID 是否更改?

标签 java tomcat cookies http-headers httpurlconnection

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

目前的实现是这样的:

  1. http post 到“登录”页面,存储返回的 cookie(假设它是 JSESSIONID=9845)。
  2. http 发布到“doSomething”页面,将存储的 cookie (JSESSIONID=9845) 与请求一起传递,不对响应 header 执行任何操作(忽略其他 cookie)
  3. http 到达“注销”页面,在请求中传递存储的 cookie (JSESSIONID=9845)。

这工作正常。

但是我不知道在第 2 步中忽略响应 header 是否安全。我是否应该期望服务器在对话期间更改 JSESSIONID 的

也就是说,如果第2步服务器在响应头中返回了Set-Cookie=[JSESSIONID=9846]怎么办?

我可以想象如下:

  1. 这在现实生活中不会发生,不值得检查,当前代码没问题。
  2. 这表明 Tomcat 服务器存在严重问题,值得检查,并且代码应该停止对话而无需进一步调用
  3. 这是合法的,Tomcat 服务器只是想为 session 使用一个新标识符,所以我必须存储新值,并在后续调用中使用它。当前代码应完成。

我想真正的浏览器会执行上面的 3. 选项,但也许 1. 和 2. 选项也是可以接受的?

最佳答案

通常 session 会在登录和注销时发生变化,这意味着您可以期望在很大程度上是安全的(但请继续阅读,我只说“通常”)。您在问忽略 HTTP 规范是否安全 - 我认为不安全,因为总是会出现意想不到的变化,使您的应用难以维护或升级基础架构。

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

如果您的“登录、执行某些操作、注销”操作始终是半原子操作(例如,立即紧随其后),则节点 3 在三个请求之间出现故障的可能性可以忽略不计。如果您将 session 保持打开状态一段时间,您可能想要为这样的事件打个招呼。

总结:是否建议忽略 HTTP 规范?不,你最有可能逃脱这样做:你决定。我举了一个它会咬你的例子,可能是 future 几年。你可能会轻易摆脱它。如果您忽略规范,您的实现可能会更容易(维护)。但是错误将更难发现,因为这些问题在将来出现时可能看似随机且很少见,例如调试噩梦。

关于java - 在与 Tomcat Web 服务器的对话期间,我应该检查 JSESSIONID 是否更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46685732/

相关文章:

java - 设计模式 - 一个公共(public)类利用许多隐藏类

java - 无法访问本地计算机以外的部署的 Web 应用程序

java - 将请求重定向到 servlet 中的 JSP 出错?

grails - 如何在Grails中访问Cookie的键值对?

javascript - 将条目索引页面存储到 cookie 并将访问者发送回该索引页面,无论文件夹如何

django - 使用 chrome 扩展和 Django 进行身份验证

java - 使用java进行类似于ajax的调用

java - 在Java中实现虚拟列表

java - 如何使用 Google/GSON 将 JSON 字符串转换为 Java POJO?

java - 我在哪里可以找到 JOSSO 数据库配置文件?