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

PHP中,人们始终可以从其代码的任何部分访问当前请求或响应.这个概念是PHP编程的基础.请求数据,响应数据,会话数据(等)始终存在!

Java Servlet中不会发生这种情况!为了能够访问代码中的HttpServletRequest,HttpServletResponse,HttpSession(等),您需要将它们作为函数变量传递.这意味着您无法编写一个本质上“了解”所有这些内容并消除传递它们的复杂性的Web框架.

因此,我设计了以下解决方案:

>创建并注册一个ServletRequestListener.
>在requestInitialized事件发生时,将当前的HttpServletRequest绑定到JNI上下文,并提供当前线程的名称(Thread.currentThread().getName());
>根据requestDestroyed事件,将上述JNI资源解除绑定以进行清理.

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

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

同样,默认情况下,每个Web应用程序的JNI资源都是分开的,因此无需担心混淆它们,也不必担心一个Web应用程序可以访问其他Web应用程序的请求而引起的安全问题.

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

你怎么看?

解决方法:

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

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

有关类似的问题(及其答案),请参见Get the HttpServletRequest (request) object from Java code.

上一篇:java-我的代码中JNDI名称在哪里?


下一篇:Javamail作为tomcat中的JNDI资源