spring中獲取request和response
阿新 • • 發佈:2019-01-09
在spring專案中,我們通常有幾種方法可以獲取request物件,
1直接引數獲取
2.在程式碼裡面獲取可以通過RequestContextHolder的靜態方法getRequestAttributes()獲取Request相關的變數,如request, response等。
eg:
在大部分的情況下,它都能很好地工作,使用了檔案上傳的話,那麼將獲取不到其引數
由於使用了檔案上傳,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的方法入參,即可以正確獲取引數值。
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的方法入參,即可以正確獲取引數值。