開發(fā)中我們會(huì)使用ajax來發(fā)起請(qǐng)求,請(qǐng)求方式為get時(shí),request.getParameterMap()可以獲取到請(qǐng)求的參數(shù),請(qǐng)求方式為post時(shí),如果content_type 如果為application/json,數(shù)據(jù)格式為json時(shí),則獲取不到。
原因:
???? ? ? 接口中使用@RequestBody接受對(duì)象,該注解會(huì)調(diào)用request獲取流的方法,但是該方法只能獲取一次,第二次獲取會(huì)拋出異常
解決方案,通過過濾器request進(jìn)行保存,復(fù)寫獲取流的方法
請(qǐng)求包裝
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>
通過以上方法,就可以獲取請(qǐng)求的參數(shù)了,而且可以解決
getReader()/getInputStream() has already been called for this request 報(bào)錯(cuò)