getReader()/getInputStream() has already been called for this request 報(bào)錯(cuò)

開發(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ò)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容