从Java代码获取HttpServletRequest(请求)对象

ase*_*eem 13 java servlets

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

我可以安全地假设我处于Servlet环境中.

Jon*_*eet 18

那么你应该把它传下来,如果你需要的话.你做的任何其他事情都会变得很丑陋.

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

但是,我强烈建议您明确说明您的依赖项.要么传递servlet请求,要么只传递你需要的位.

  • +1:对于*应该将其传递*.比起丑陋的ThreadLocal黑客,我真的不会将其作为请求线程使用,可以由webcontainer汇集,或者你必须确保在完成时将其从线程中删除.太多的工作和令人讨厌的副作用/ (4认同)
  • 并不总是可以将对象传递下来.您可能必须跨越一些您无法控制的API.即使您可以更改任何API,在所有方法中声明请求参数也是愚蠢和不方便的,并且每次调用任何方法时都会传递请求对象.只要您知道自己在做什么,ThreadLocal就可以了. (4认同)
  • @BalusC,在理智的人提供和选择框架的情况下,你是完全正确的.如果一个人被迫采取某种"天才"的设计,那么就应该选择"较小的邪恶".当然,我们不知道这里的情况是什么 - 只是有"某些原因":) (2认同)

ska*_*man 9

假设您无法将请求对象传递给调用堆栈,则需要某种共享机制,这不是理想的,但有时是必要的.

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

Servlet 2.3通过LocaleContextHolder和RequestContextHolder将请求公开给当前线程的过滤器.要在web.xml中注册为过滤器.

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

如果您打算使用ThreadLocal,那么最好使用现有的,有效的解决方案,而不是冒险陷入困境,哪些ThreadLocal代码容易出错.