【问题标题】:Spring 3 MVC accessing HttpRequest from controllerSpring 3 MVC 从控制器访问 HttpRequest
【发布时间】: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"; 
}

上面的方法不打印任何东西。

您对此有什么建议吗?

【问题讨论】:

    标签: spring-mvc httprequest httpsession request-mapping


    【解决方案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 控制器总是单例的。
    • 这感觉不对 - 如果控制器在给定时间处理多个请求怎么办?那么什么是“当前”请求?
    • 这个问题有一些关于你要求的解释:stackoverflow.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();
      

      【讨论】:

        猜你喜欢
        • 2013-10-23
        • 2012-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        相关资源
        最近更新 更多