牛骨文教育服务平台(让学习变的简单)
博文笔记

spring中获取request和response

创建时间:2018-01-22 投稿人: 浏览次数:459
在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的方法入参,即可以正确获取参数值。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。