gpt4 book ai didi

java - HttpServlet 中间类未按预期初始化

转载 作者:行者123 更新时间:2023-11-28 22:13:35 27 4
gpt4 key购买 nike

我有一个 Web 应用程序,其中多个 servlet 使用一定数量的相同逻辑进行预初始化(设置日志记录、 session 跟踪等)。我所做的是在 javax.servlet.http.HttpServlet 和我的具体 servlet 类之间引入一个中间层:

public abstract class AbstractHttpServlet extends HttpServlet {
// ... some common things ...
}

然后:

public class MyServlet extends AbstractHttpServlet {
// ... specialized logic ...
}

我在 AbstractHttpServlet 的默认(也是唯一)构造函数中做的一件事是设置一些私有(private)成员变量。在这种情况下,它是一个 UUID,用作 session 标识符:

public abstract class AbstractHttpServlet extends HttpServlet {
private UUID sessionUuid;

public AbstractHttpServlet() {
super();
this.sessionUuid = UUID.randomUUID();
// ... there's more, but snipped for brevity ...
}

protected UUID getSessionUuid() {
return this.sessionUuid;
}
}

然后我在 MyServlet 中使用 getSessionUuid() 来提供请求中的 session 跟踪。这非常有用,例如在日志记录中,能够筛选大型日志文件并获取与单个 HTTP 请求相关的所有条目。原则上, session 标识符可以是任何东西;我只是选择使用 UUID,因为它很容易生成一个随机 UUID,而且无需担心不同服务器之间的冲突、种子问题、搜索日志文件将匹配项作为较长字符串的一部分等。

我看不出为什么多次执行应该在 sessionUuid 成员变量中获得相同的值,但在实践中,它们似乎确实如此。就好像该类的实例甚至在很长一段时间内都被多个请求重用(似乎直到服务器进程重新启动)。

在我的例子中,与类完成的有用工作相比,类实例化的开销很小,所以理想情况下,我希望 Tomcat 总是为每个请求创建新的类实例,从而强制它每次单独执行构造函数。 是否可以注释该类以确保它在每个请求中被实例化?不需要更改服务器配置的答案是更受欢迎的。

如果做不到这一点,有没有办法(除了在每个 do*() 方法中分别这样做,例如 doGet()doPost() 等) 确保对每个 HTTP 请求进行某种初始化,从而执行特定的 servlet?

最佳答案

It's as if the instance of the class is being reused for multiple requests even over a long period of time (seemingly until the server process is restarted).

是的,这正是将要发生的事情,也是您应该期待的事情。

servlet 并不意味着是 session - 它只是意味着处理程序。

如果你想对每个请求做“某事”,无论使用什么方法,你都可以覆盖 service方法,采取任何行动,然后调用 super.service()。但是,您不应该更改 servlet 本身的状态 - 请记住,多个请求可能同时在同一个 servlet 中执行。

基本上,您的要求与 servlet 的设计背道而驰 - 您应该设计而不是反对它。您可以修改请求本身(使用 setAttribute)来存储一些仅与此请求相关的信息——但无论如何我可能会在比 HTTP 更高的级别上这样做。 (我会尝试使 servlet 本身非常小,只是尽可能地委托(delegate)给非 servlet 感知的类,这使得它们更容易测试。)

关于java - HttpServlet 中间类未按预期初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17444450/

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