2011-12-14 121 views
66

我想自己處理請求和會話屬性,而不是彈出@SessionAttributes,以便登錄cookie處理。Spring 3 MVC從控制器訪問HttpRequest

我只是不知道如何從控制器中訪問HttpRequest,我需要一種方法去@RequestAttribute之上的一層,並訪問HttpRequest本身。通過執行ApplicationContext並調用getAttribute()來使用Stripes。

而且,傳遞HttpServletRequest作爲參數似乎並沒有被工作:

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

上述方法不顯示任何信息。

您對此有何建議?

回答

133

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下的某些人。嘗試使用Spring WebRequest/WebResponse對象,如Eduardo Zola指出的那樣。

我強烈建議你看看Spring MVC能夠自動注入你的處理器方法的list of supported arguments

+0

嗨,THX的提示,我不知道我在做什麼錯,但是這是行不通的:它不打印任何東西:\t @RequestMapping(值=「/」) \t公共字符串家(HttpServletRequest的請求){ \t \t \t System.out.println(「」+ request.getSession()。getCreationTime()); \t \t \t \t return「home」; \t \t \t}這應該pring當前的數量pis millis,但它不,也註釋該方法與@RequestBody不會改變任何東西,任何進一步的建議? thx爲這 – JBoy 2011-12-14 23:47:31

+1

我第二JBoy也不起作用 – 2012-10-25 06:52:23

53

我知道這是一個老問題,但...

您也可以在課堂上使用這樣的:

@Autowired 
private HttpServletRequest context; 

併爲您在使用本會提供的HttpServletRequest當前實例您方法。