120

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

我只是不知道如何HttpRequest从控制器中访问,我需要一种方法来访问上一层@RequestAttribute并访问它HttpRequest本身。使用 Stripes 通过实现ApplicationContext和调用来做到这一点getAttribute()

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

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

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

你对此有什么建议吗?

4

4 回答 4

211

如果您只是将它添加到控制器方法签名中,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(...);

}

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

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

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

于 2011-12-14T12:19:58.407 回答
86

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

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

@Autowired
private HttpServletRequest context;

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

于 2013-04-10T23:58:34.263 回答
2

另一种方法是使用RequestContextHolderlike:(自:2.0)

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

HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
于 2021-10-21T06:53:55.310 回答
0
@RequestMapping(value="/") public String home(HttpServletRequest request){
    System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
    return "home"; 
}
于 2019-06-13T12:29:52.953 回答