从 Java 代码中获取 HttpServletRequest (request) 对象

2022-09-04 06:10:59

我需要在Java代码中获取请求对象。由于某些原因,我无法将此对象传递给我的代码。有什么办法可以这样说:?getCurrentHTTPServletRequest

对我来说,假设我处于Servlet上下文中是安全的。


答案 1

好吧,如果你需要它,你应该把它传下来。基本上,你做的任何其他事情都会很丑陋。

您可以使用 ThreadLocal 变量 - 基本上在收到请求时为该特定线程设置上下文,然后稍后获取它。只要您只需要在处理请求的线程中获取请求,并且只要您不执行任何时髦的异步请求处理,这就可以工作。不过,正是由于这些原因,它很脆。

但是,我强烈建议您明确说明您的依赖关系。要么向下传递 servlet 请求,要么只传递您需要的位。


答案 2

假设您无法将请求对象向下传递到调用堆栈,那么某种共享机制就变得必要,这并不理想,但有时是必要的。

Spring提供了RequestContextFilter就是为了这个目的。它使用 ,并允许代码通过 RequestContextHolder 获取当前请求。请注意,此过滤器不需要您使用Spring的任何其他部分:ThreadLocal

Servlet 2.3 过滤器,它通过 LocaleContextHolder 和 RequestContextHolder 向当前线程公开请求。要在 Web 中注册为筛选器.xml。

此过滤器主要用于第三方 servlet,例如 JSF FacesServlet。在Spring自己的Web支持中,DispatcherServlet的处理是完全足够的。

如果您要使用 ,那么最好使用现有的工作解决方案,而不是冒着错误蔓延的风险,这是代码容易出现的。ThreadLocalThreadLocal


推荐