Spring 3 MVC 从控制器访问 HttpRequest

我希望自己处理请求和会话属性,而不是将其留给 Spring @SessionAttributes来处理,比如 Cookie 的登录处理。

我只是不知道如何才能访问的 HttpRequest从一个控制器,我需要一个办法去上面的 @RequestAttribute层和访问的 HttpRequest本身。通过实现一个 ApplicationContext并调用 getAttribute(),使用 Stripes 完成此操作。

另外,将 HttpServletRequest作为参数传递似乎不起作用:

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

The above method does not print anything.

你对此有什么建议吗?

291765 次浏览

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

For instance:

/**
* 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(...);


}

如您所见,只需将 HttpServletRequestHttpServletResponse对象添加到签名中,Spring MVC 就可以将这些对象传递给您的控制器方法。您还需要 HttpSession对象。

编辑: 似乎 HttpServletRequest/Response 在 Spring3下不能为某些人工作。正如 Eduardo Zola 指出的那样,尝试使用 Spring WebRequest/WebResponse 对象。

我强烈建议您看一看 Spring MVC 能够自动注入到您的处理程序方法中的 支持的论点列表

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

你也可以在你的课堂上使用:

@Autowired
private HttpServletRequest context;

And this will provide the current instance of HttpServletRequest for you use on your method.

@RequestMapping(value="/") public String home(HttpServletRequest request){
System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
return "home";
}

另一种方法是像下面这样使用 RequestContextHolder: (从: 2.0开始)

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

HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();