Spring 3 MVC 从控制器访问 HttpRequest
Posted
技术标签:
【中文标题】Spring 3 MVC 从控制器访问 HttpRequest【英文标题】:Spring 3 MVC accessing HttpRequest from controller 【发布时间】:2012-01-20 05:08:44 【问题描述】:我想自己处理请求和会话属性,而不是将其留给 spring@SessionAttributes
,例如用于登录 cookie 处理。
我只是不知道如何从控制器中访问HttpRequest
,我需要一种方法来访问@RequestAttribute
之上的一层并访问HttpRequest
本身。使用 Stripes 通过实现 ApplicationContext
并调用 getAttribute()
来实现这一点。
另外,将HttpServletRequest
作为参数传递似乎不起作用:
@RequestMapping(value="/") public String home(HttpServletRequest request)
System.out.println(""+request.getSession().getCreationTime());
return "home";
上面的方法不打印任何东西。
您对此有什么建议吗?
【问题讨论】:
【参考方案1】:如果你只是将它添加到你的控制器方法签名中,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 不适用于 Spring 3 下的某些人。尝试使用 Eduardo Zola 指出的 Spring WebRequest/WebResponse 对象。
我强烈建议您查看 list of supported arguments,Spring MVC 能够自动神奇地注入您的处理程序方法。
【讨论】:
嗨,谢谢提示,我不知道我做错了什么,但这不起作用:它不打印任何东西:@RequestMapping(value="/") public String home( HttpServletRequest request) System.out.println(""+request.getSession().getCreationTime());回家”;这应该是 pof millis 的当前数量,但它没有,用 @RequestBody 注释方法也不会改变任何东西,还有什么进一步的建议吗?谢谢这个 感谢 @jjmontes 提供指向 Spring MVC 支持的参数的链接! 我对 Spring 几乎一无所知,但我必须在参数前添加@Context
注释才能注入它们。可能是新的东西,我不知道,但我想我会提到它。【参考方案2】:
我知道这是一个老问题,但是...
您也可以在课堂上使用它:
@Autowired
private HttpServletRequest context;
这将提供HttpServletRequest
的当前实例供您在方法中使用。
【讨论】:
这样做不会阻止控制器bean成为单例吗? Spring 控制器总是单例的。 这感觉不对 - 如果控制器在给定时间处理多个请求怎么办?那么什么是“当前”请求? 这个问题有一些关于你要求的解释:***.com/questions/17235794/… 在 GWT 的RemoteServiceServlet
中有类似 getThreadLocalRequest()
的东西会非常有用,即使它在高度并发的环境中执行,它也总是返回正确的请求。【参考方案3】:
@RequestMapping(value="/") public String home(HttpServletRequest request)
System.out.println("My Attribute :: "+request.getAttribute("YourAttributeName"));
return "home";
【讨论】:
【参考方案4】:另一种方法是使用RequestContextHolder
,例如:(自:2.0)
RequestContextHolder Holder 类以线程绑定的 RequestAttributes 对象的形式公开 Web 请求。如果可继承标志设置为 true,则该请求将被当前线程产生的任何子线程继承。
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
【讨论】:
以上是关于Spring 3 MVC 从控制器访问 HttpRequest的主要内容,如果未能解决你的问题,请参考以下文章