gpt4 book ai didi

java - JSP/Servlet 设计问题 - 通过 JNDI 使请求/响应全局可用

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:00:46 25 4
gpt4 key购买 nike

在 PHP 中,人们总是能够从其代码的任何部分访问当前请求或响应。这个概念是 PHP 编程的基础。 请求数据、响应数据、 session 数据(等)始终存在!

这不会发生在 Java Servlet 中!为了在您的代码中访问 HttpServletRequest、HttpServletResponse、HttpSession(等),您需要将它们作为函数变量传递。这意味着您无法编写一个 固有地“了解” 所有这些并消除传递它们的复杂性的 Web 框架。

所以,我设计了这个解决方案:

  1. 创建并注册一个 ServletRequestListener。
  2. 根据 requestInitialized 事件将当前 HttpServletRequest 绑定(bind)到 JNI 上下文,给出当前线程的名称 (Thread.currentThread().getName());
  3. 根据 requestDestroyed 事件取消绑定(bind)上述 JNI 资源以进行清理。

这样一来,人们就可以从代码的任何位置访问当前请求/响应,因为它们始终存在于 JNI 上下文中,并且可以通过提供当前线程的名称来检索。

所有已知的 servlet 容器都为每个请求实现单线程模型,因此请求不会混淆(当然不能忘记清理它们)。

此外,每个 Web 应用程序的 JNI 资源 默认情况下都是分开的,因此无需担心将它们混淆或一个 Web 应用程序可能引起的安全问题访问其他人的请求。

有点扭曲,但很好很简单......

你怎么看?

最佳答案

我认为一些 Web 框架(GWT、Axis)已经这样做了,但是以更简单的方式:通过使用 ThreadLocal静态变量(或可从单例访问)。 Spring也有这种可能。

不过,我不确定它是否适用于所有容器。如果容器使用非阻塞 IO 并重用同一个线程来并行处理多个请求,它将不再起作用。

参见 Get the HttpServletRequest (request) object from Java code对于类似的问题(及其答案)。

关于java - JSP/Servlet 设计问题 - 通过 JNDI 使请求/响应全局可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7188447/

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