在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;