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的方法入参,即可以正确获取参数值。

3.判断如果是文件上传时把原来的request对象统一转换为MultipartHttpServletRequest

web.xml增加一个过滤器

<filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.ydtx.comm.MyFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

自定义过滤器

package com.ydtx.comm;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.context.support.XmlWebApplicationContext;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;

public class MyFilter implements Filter {
private CommonsMultipartResolver multipartResolver;
private FilterConfig filterConfig;

@Override
public void init(FilterConfig filterConfig) throws ServletException {
    multipartResolver = new CommonsMultipartResolver();
    this.filterConfig = filterConfig;
}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    // 获取bean
    ServletContext sc = filterConfig.getServletContext();
    XmlWebApplicationContext cxt = (XmlWebApplicationContext) WebApplicationContextUtils.getWebApplicationContext(sc);
    // 处理 multipart/form-data 请求
    String contentType = request.getContentType();
    if (contentType != null && contentType.contains("multipart/form-data")) {
        MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart(request);
        // 将转化后的 request 放入过滤链中
        servletRequest = multiReq;
        request = multiReq;
    }
    //todo : your code
    filterChain.doFilter(servletRequest, servletResponse);
}

@Override
public void destroy() {}

}

获取request和response对象

@Autowired
 protected HttpServletRequest request;
@Autowired
protected HttpServletResponse response;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值