解决流不能重复使用
在InputStream讀取的時候,會有一個pos指針,他指示每次讀取之后下一次要讀取的起始位置,當(dāng)讀到最后一個字符的時候,pos指針不會重置。”?
,就是說InputStream的讀取是單向的。但是并不是所有的InputStream實現(xiàn)類都是這樣的實現(xiàn)方式。
可以換存到byte數(shù)組。
public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {private final byte[] body;public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);body = HttpHelper.getBodyString(request).getBytes(Charset.forName("UTF-8"));}@Overridepublic BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream()));}@Overridepublic ServletInputStream getInputStream() throws IOException {final ByteArrayInputStream bais = new ByteArrayInputStream(body);return new ServletInputStream() {@Overridepublic int read() throws IOException {return bais.read();}@Overridepublic boolean isFinished() {return false;}@Overridepublic boolean isReady() {return false;}@Overridepublic void setReadListener(ReadListener readListener) {}};}}HttpHelper.java /*** 獲取請求Body** @param request* @return*/ public static String getBodyString(ServletRequest request) {StringBuilder sb = new StringBuilder();InputStream inputStream = null;BufferedReader reader = null;try {inputStream = request.getInputStream();reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")));String line = "";while ((line = reader.readLine()) != null) {sb.append(line);}} catch (IOException e) {e.printStackTrace();} finally {if (inputStream != null) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (reader != null) {try {reader.close();} catch (IOException e) {e.printStackTrace();}}}return sb.toString(); }Filter.Java @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {// 防止流讀取一次后就沒有了, 所以需要將流繼續(xù)寫出去ServletRequest requestWrapper = new BodyReaderHttpServletRequestWrapper(request);String json = HttpHelper.getBodyString(requestWrapper);System.out.println(json);filterChain.doFilter(requestWrapper, response);
?
轉(zhuǎn)載于:https://www.cnblogs.com/zyzcj/p/7265087.html
總結(jié)
- 上一篇: python机器学习入门(Day1:Nu
- 下一篇: 贷款余额是指什么意思