1. 程式人生 > >spring中獲取request和response

spring中獲取request和response

在spring專案中,我們通常有幾種方法可以獲取request物件,
1直接引數獲取
 @RequestMapping("/path")

   public String getReqAndRes(HttpServletRequest request, HttpServletResponse response){

      /**  相關業務程式碼   此時可以直接使用request response物件 */

   }


2.在程式碼裡面獲取可以通過RequestContextHolder的靜態方法getRequestAttributes()獲取Request相關的變數,如request, response等。
eg:
public class RequestHolder {
    public static HttpServletRequest getRequest(){
        HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return req;
    }
    public static HttpServletResponse getResponse(){
        HttpServletResponse resp = ((ServletWebRequest)RequestContextHolder.getRequestAttributes()).getResponse();
        return resp;
    }
}

在大部分的情況下,它都能很好地工作,使用了檔案上傳的話,那麼將獲取不到其引數
由於使用了檔案上傳,form表單的enctype型別為”multipart/form-data”,springmvc對檔案上傳的處理類實際卻為spring-mvc.xml檔案中配置的CommonsMultipartResolver,該類先判斷當前請求是否為multipart型別,如果是的話,將request物件轉為MultipartHttpServletRequet.

RequestContextHolder中的request:方法中完成了RequestContextHolder的requestAttributes設定,
而doService()在這之後呼叫,DispatcherServlet中的processRequest()方法即在doService()之中,
所以從RequestContextHolder中獲取到的就是原來的RequestFacade物件,而不是經過spring mvc處理之後的MultipartHttpServletRequest物件,
其後果就是,從RequestContextHolder獲取request後,無法直接通過getParameter()獲取引數值。

最便捷的解決辦法: 
直接將HttpServletRequest作為spring mvc的方法入參,即可以正確獲取引數值。