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


如您所见,只需将HttpServletRequestHttpServletResponse 对象添加到签名中,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的主要内容,如果未能解决你的问题,请参考以下文章

从 Spring MVC 控制器访问服务层

从 jsp 访问 Spring MVC DI bean

spring mvc整合shiro无法访问控制器是啥问题

Spring MVC 从 2.5 到 3.0

将JSON数组从javascript传递给spring mvc控制器

服务层和数据访问对象层如何适应 Spring MVC 架构?