我想自己处理请求和会话属性,而不是把它留给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";
}
上面的方法不会打印任何内容。
你对此有什么建议吗?
发布于 2011-12-14 20:19:58
如果你只是把它添加到你的控制器方法签名中,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(...);
}
如您所见,只需将HttpServletRequest
和HttpServletResponse
对象添加到签名中,就可以使Spring MVC将这些对象传递给您的控制器方法。您还需要HttpSession
对象。
编辑:似乎HttpServletRequest/Response在Spring3下对某些人不起作用。正如Eduardo Zola指出的那样,尝试使用Spring WebRequest/WebResponse对象。
我强烈建议您查看一下Spring MVC能够自动神奇地注入到处理程序方法中的list of supported arguments。
发布于 2013-04-11 07:58:34
我知道这是个老问题,但是...
您也可以在您的类中使用以下代码:
@Autowired
private HttpServletRequest context;
这将提供当前的HttpServletRequest
实例,供您在方法上使用。
发布于 2021-10-21 06:53:55
另一种方法是像这样使用RequestContextHolder
:(从2.0开始)
类以绑定线程的RequestAttributes对象的形式公开RequestContextHolder请求。如果可继承标志设置为true,则该请求将由当前线程派生的任何子线程继承。
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
https://stackoverflow.com/questions/8504258
复制相似问题