Thread / Stacktrace中的会话ID

时间:2010-07-28 13:35:09

标签: java servlets

我没有遇到什么问题,只是想着事情。

如果我有一个Web应用程序,我们可以调用一个servlet。如果servlet调用调用数据库层的数据管理器。让我们假设其中一个级别会引发异常。有没有一种方法可以识别堆栈顶部存在的会话ID,而不会将表达式一直冒到顶层并进入servlet层?

希望这有道理......:o)

2 个答案:

答案 0 :(得分:5)

一般来说,最好让异常泡到可以处理它的层 - 即你的servlet。这就是我的建议。

您始终可以创建一个拦截每个请求的Filter,并将当前会话ID放在public static ThreadLocal<String> sessionId;某处。然后可以从同一个线程的任何地方访问它。

另一个故事是sessionId是否有用。也许您可以使用您的用户ID,用户IP或其他类似信息。

答案 1 :(得分:2)

不可能,除非您编写自己的代码以向下游传递会话ID。出于所有实际目的,这些是两个不同的层,可以存在于两个不同的JVM中。看看context object design pattern,关于n层系统如何实现这一目标。

顺便说一下,为了记录而传递会话ID是个坏主意。更好的方法是传递一个唯一标识请求的执行上下文对象(因此也用于标识其背后的用户)。

当您使用上下文对象模式时,您还应该知道它的pitfalls