Spring 3 MVC从控制器访问HttpRequest


104

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

我只是无法弄清楚如何HttpRequest从控制器内部访问,我需要一种方法来访问之上@RequestAttribute并访问HttpRequest自身。使用Stripes可以通过实现an ApplicationContext并调用来完成此操作getAttribute()

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

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

上面的方法不打印任何内容。

您对此有什么建议吗?

Answers:


184

如果您仅将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(...);

}

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

编辑:看来HttpServletRequest / Response在Spring 3下对某些人不起作用。正如Eduardo Zola指出的那样,尝试使用Spring WebRequest / WebResponse对象。

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


嗨,谢谢你的提示,我不知道我在做什么错,但这不起作用:它不会打印任何内容:@RequestMapping(value =“ /”)public String home(HttpServletRequest request){System.out。 println(“” + request.getSession()。getCreationTime()); 回家”; }这应该使当前数量pof毫秒,但不要这样做,并且使用@RequestBody注释方法不会更改任何内容,还有其他建议吗?为此
感谢

2
感谢@jjmontes提供到Spring MVC支持的参数的链接!
巴雷特2014年

我对Spring几乎一无所知,但是我不得不@Context在参数之前添加注释,以便注入它们。我不知道,可能是新的东西,但我想提一提。
ivarni

81

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

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

@Autowired
private HttpServletRequest context;

这将为您提供方法的当前实例HttpServletRequest


7
这样不是防止控制器bean成为单例吗?
jjmontes 2013年

2
弹簧控制器始终为单例。
Deividi Cavarzan

16
感觉不对-如果控制器在给定时间处理多个请求,该怎么办?那么“当前”请求是什么?
sbk 2014年

2
这个问题有一些关于你的解释是问了:stackoverflow.com/questions/17235794/...
Deividi Cavarzan

1
getThreadLocalRequest()在GWT中有类似的东西,RemoteServiceServlet即使它在高度并发的环境中执行,总是返回正确的请求,这将非常有用。
Yuriy Nakonechnyy 2014年

0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.