在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.