过滤器中处理multipart/form-data头部的post请求只能获取一次参数的问题(记录一下)

你可能很疑惑,为什么request对象中的InputStream或者Reader只能使用一次?

原理很简单,可以把流比喻成水,request里面的inputStream就好比杯子中的水。试问杯子中的水倒掉之后还能继续倒吗?当然不能滴!InputStream里面有做指针和同步处理,一旦指针到了末尾是不会回来的。那么我们怎么拷贝request body里面的数据呢,当然我们得找一种可以复制的存储方式了,比如String,可以先把request 的inputStream转成String,然后又把String转成byte[] 存回去就是了,String对象我们可以无限使用。

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
	try {
			MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper((HttpServletRequest) servletRequest);
			
			System.out.println("RequestBody:" + requestWrapper.getBodyString());
			
			filterChain.doFilter(requestWrapper, servletResponse);
	
	} catch (IOException e) {
	e.printStackTrace();
}
}

这是MyHttpServletRequestWrapper类,主要是储存body string,和给request对象塞byte[]:

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body;

private String bodyString;

public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);

this.bodyString = StreamUtils.copyToString(request.getInputStream(), Charset.forName("UTF-8"));

body = bodyString.getBytes("UTF-8");

}

public String getBodyString() {
return this.bodyString;

}

@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));

}

@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);

return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}

@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return bais.read();
}
};
}
}

还有第二种(我这边没起作用):
过滤器中处理multipart/form-data头部的post请求request.getParameter(")获取不到参数问题
标签: request.getParameter()无法获取参数

如果不是文件类型请求,我们使用request.getParameter("");方法是可以获取到参数内容的,如果是文件类型的请求即请求的头部信息为“multipart/form-data”,时,需要如下处理:


		HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        String contentType = req.getContentType();
        if (contentType != null && contentType.contains("multipart/form-data")) {
            MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
            MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
            // 将转化后的 request 放入过滤链中
            request = multipartRequest;
 		}

通过spring的轮子,实现request的转换,然后使用request.getParameter("");

发现参数获取正常。

转载自:https://blog.csdn.net/weixin_35529551/article/details/114103502
转载自:https://www.cxymm.net/article/weixin_30778805/98915278

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值