Spring 3 MVC从控制器访问HttpRequest

JBo*_*Boy 93 spring-mvc httprequest httpsession request-mapping

我想自己处理请求和会话属性,而不是将其留给spring @SessionAttributes,例如登录cookie处理.

我只是无法弄清楚如何HttpRequest在控制器中访问from,我需要一种方法去上面一层@RequestAttribute并访问它HttpRequest自己.使用Stripes来实现ApplicationContext和调用getAttribute().

此外,传递HttpServletRequestas参数似乎不起作用:

@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println(""+request.getSession().getCreationTime());
    return "home"; 
}
Run Code Online (Sandbox Code Playgroud)

上述方法不打印任何内容.

你对此有什么建议吗?

jjm*_*tes 170

如果你只是将它添加到你的控制器方法签名中,Spring MVC会给你HttpRequest:

例如:

/**
 * Generate a PDF report...
 */
@RequestMapping(value = "/report/{objectId}", method = RequestMethod.GET)
public @ResponseBody void generateReport(
        @PathVariable("objectId") Long objectId, 
        HttpServletRequest request, 
        HttpServletResponse response) {

    // ...
    // Here you can use the request and response objects like:
    // response.setContentType("application/pdf");
    // response.getOutputStream().write(...);

}
Run Code Online (Sandbox Code Playgroud)

如您所见,只需将HttpServletRequestHttpServletResponse对象添加到签名中,Spring MVC就会将这些对象传递给您的控制器方法.你也想要这个HttpSession对象.

编辑:似乎HttpServletRequest/Response不适用于Spring 3下的某些人.尝试使用Spring WebRequest/WebResponse对象,如Eduardo Zola所指出的那样.

我强烈建议您查看Spring MVC能够自动神奇地注入到处理程序方法的受支持参数列表.

  • 感谢 @jjmontes 提供 Spring MVC 支持的参数的链接! (2认同)

Dei*_*zan 73

我知道这是一个老问题,但......

您也可以在课堂上使用它:

@Autowired
private HttpServletRequest context;
Run Code Online (Sandbox Code Playgroud)

这将提供HttpServletRequest您在方法上使用的当前实例.

  • 这感觉不对 - 如果控制器在给定时间处理多个请求怎么办?什么是"当前"请求呢? (15认同)
  • 这样做不会阻止控制器bean成为单例吗? (7认同)
  • Spring 控制器总是单例的。 (2认同)
  • 这个问题对您的要求有一些解释:http://stackoverflow.com/questions/17235794/how-does-spring-mvc-handle-multiple-users (2认同)

sen*_*982 5

另一种方法是使用RequestContextHolder类似:(自:2.0)

RequestContextHolder Holder 类以线程绑定的 RequestAttributes 对象的形式公开 Web 请求。如果可继承标志设置为 true,则当前线程生成的任何子线程都会继承该请求。

HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Run Code Online (Sandbox Code Playgroud)