gpt4 book ai didi

tomcat - 重写Tomcat从请求中获取sessionid的方法

转载 作者:行者123 更新时间:2023-11-28 21:52:37 32 4
gpt4 key购买 nike

根据 Java EE 标准,Tomcat 允许请求以两种方式指定其现有 session ID:1) 通过 cookie; 2) 通过“路径参数”(不是常规参数;路径参数的格式为 http://host/path/file.ext;jsessionid=xxx?a=b&c=d... - 注意“;”以及查询字符串仅在路径参数之后开始的事实)。我想要的是在“?”之后的查询字符串中将请求中的 session ID 作为常规参数传递,例如 http://host/path/file.ext?jsessionid=xxx .

当请求到达我可以拦截它并更改容器确定 session ID 的方式(例如,在过滤器或 Servlet 中)时,为时已晚。我想改变的行为是在客户端请求的初始处理中。出于所有显而易见的原因,我想避免做的是更改 Coyote 或 Tomcat 代码并自己重建 Tomcat。我更愿意做的是覆盖适当的代码并配置 Tomcat 以使用该代码来确定请求的 session ID。这似乎不可能,但我希望我是错的。

我知道以这种方式获取 session ID 是不标准的;我知道使用 cookie 或路径参数都是跟踪 session 状态的好方法;我知道将 session ID 放在实际查询字符串中会带来潜在的问题。无论如何我都需要这样做。

运行 Tomcat 7,顺便说一句。

最佳答案

最简单的方法是从源代码构建 Tomcat,然后修改 CoyoteAdapter.java 类。

这是此代码所在的位置,但它不是代码中易于扩展的部分,您只需插入一些代码即可拦截这部分请求管道。

你可以变得聪明并实现你自己的依赖于你自己的 CoyoteAdapter 的连接器,而不是仅仅“就地”破解它,但最终你仍然会遇到跟上更新等维护问题。

您还需要小心,因为通常情况下请求参数不会被“解析”,直到有人要求它们,并且通常直到实际用户代码才完成(我不相信它在点击之前在管道中完成用户代码)。

这很重要,因为对于 GET,参数解析是根据请求 header 完成的,而对于 POST,则基于内容。如果您向请求请求参数,它不会关心它是 POST 还是 GET,并且会自动“做正确的事情”。

这意味着如果您从 POST 请求请求参数,管道将在用户应用程序代码之前使用输入流(开始指向请求负载,在 header 之后)。取决于用例,但有些应用需要原始流,因此您必须小心使用内置的请求参数逻辑,而不是对原始 URL 本身采取行动。

你也可以通过一个简单的过滤器来解决这个问题,然后你可以将 HttpServletRequest 转换为底层的 Tomcat 实现(我现在不知道他的名字),然后调用“setSessionID”代码.不知道这在处理周期中是否为时已晚,很可能是这样。

因此,它可以完成,看起来很简单,但不能通过任何真正规定的扩展方式。官方方法是克隆 tomcat 连接器以调用您自己版本的 CoyoteAdapter,并在 server.xml 中对其进行配置。但是,如果您愿意维护自己的 tomcat 版本,直接破解 CoyoteAdapter 会容易得多。

关于tomcat - 重写Tomcat从请求中获取sessionid的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18303393/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com