开发中我们会使用ajax来发起请求,请求方式为get时,request.getParameterMap()可以获取到请求的参数,请求方式为post时,如果content_type 如果为application/json,数据格式为json时,则获取不到。
原因:
接口中使用@RequestBody接受对象,该注解会调用request获取流的方法,但是该方法只能获取一次,第二次获取会抛出异常
解决方案,通过过滤器request进行保存,复写获取流的方法
请求包装
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
public class MyRequestWrapperextends HttpServletRequestWrapper {
private byte[]buffer;
public MyRequestWrapper(HttpServletRequest request)throws IOException {
super(request);
InputStream is = request.getInputStream();
ByteArrayOutputStream baos =new ByteArrayOutputStream();
byte[] buff =new byte[1024];
int read =0;
while ((read = is.read(buff)) >0)
baos.write(buff,0, read);
this.buffer = baos.toByteArray();
}
public BufferedReader getReader()throws IOException{
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream()throws IOException {
final ByteArrayInputStream bais =new ByteArrayInputStream(buffer);
return new ServletInputStream() {
@Override
public int read()throws IOException {
return bais.read();
}
};
}
public byte[] getBuffer() {
return buffer;
}
public void setBuffer(byte[] buffer) {
this.buffer = buffer;
}
}
过滤器
package com.plcs.web.wsxd.businessoperation.businessoperation.filter;
import com.plcs.web.modules.act.rest.servlet.JsonpCallbackFilter;
import com.plcs.web.modules.sys.utils.LogUtils;
import com.plcs.web.wsxd.businessoperation.businessoperation.dto.MyRequestWrapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LogFilterimplements Filter {
private static Loggerlog = LoggerFactory.getLogger(JsonpCallbackFilter.class);
public void init(FilterConfig fConfig)throws ServletException {}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
MyRequestWrapper requestWrapper =new MyRequestWrapper(httpRequest);
// 保存日志
LogUtils.saveLog(requestWrapper,null,null,null);
chain.doFilter(requestWrapper, response);
}
public void destroy() {}
}
web.xml 配置式过滤器生效:
<filter>
<filter-name>requestFilter</filter-name>
<filter-class>com.plcs.web.wsxd.businessoperation.businessoperation.filter.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>requestFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
通过以上方法,就可以获取请求的参数了,而且可以解决
getReader()/getInputStream() has already been called for this request 报错