【发布时间】:2013-08-20 15:15:12
【问题描述】:
根据 Java EE 标准,Tomcat 允许请求以两种方式指定其现有会话 ID:1) 通过 cookie; 2) 通过“路径参数”(不是常规参数;路径参数的格式为http://host/path/file.ext;jsessionid=xxx?a=b&c=d... - 请注意“;”以及查询字符串仅在路径参数之后开始的事实)。我想要的是在“?”之后的查询字符串中将请求中的会话 ID 作为常规参数传递,例如 http://host/path/file.ext?jsessionid=xxx。
当请求到达我可以拦截它并更改容器确定会话 ID 的方式(例如在过滤器或 Servlet 中)时,为时已晚。我想改变的行为是在初始处理来自客户端的请求。出于所有显而易见的原因,我想要避免做的是更改 Coyote 或 Tomcat 代码并自己重建 Tomcat。我更愿意做的是覆盖适当的代码并配置 Tomcat 以使用该代码来确定请求的会话 ID。这似乎是不可能的,但我希望我错了。
我知道以这种方式获取会话 ID 是不标准的;我知道使用 cookie 或路径参数都是跟踪会话状态的好方法;我知道将会话 ID 放在实际的查询字符串中会带来潜在的问题。无论如何我都需要这样做。
运行 Tomcat 7,顺便说一句。
【问题讨论】:
-
您似乎有充分的理由这样做。可以分享给我们吗?
-
@JB Nizet - 当然。我们对我们的用户说,“我们不使用 cookie,期间。”我们的应用程序与隐私相关,并且能够说这是一件好事。现在,会话 cookie 当然与寿命更长的 cookie 不同,但许多用户失去了这种区别。所以这是关于隐私的感知,真的。无论如何,这意味着我需要通过 URL 保持会话(使用所有防止劫持的保护措施,obv)。但是在提供用户可以保存的内容时,“路径参数”格式会混淆一些浏览器(一些浏览器将 jsessionid 作为文件名的一部分)。
-
@Will Hartung - 非常有帮助,谢谢。是的,你说得对,我们必须在请求生命周期的早期小心解析请求中的参数。出于这个原因,我不会使用
getParameter();我只是从查询字符串中解析出来。 (正如您还指出的那样,这意味着我的会话 ID 参数无法发布,但没关系,因为 POST URL 仍然可以附加查询字符串。)
标签: tomcat httpsession jsessionid