解决流不能重复使用
在InputStream讀取的時(shí)候,會(huì)有一個(gè)pos指針,他指示每次讀取之后下一次要讀取的起始位置,當(dāng)讀到最后一個(gè)字符的時(shí)候,pos指針不會(huì)重置。”?
,就是說(shuō)InputStream的讀取是單向的。但是并不是所有的InputStream實(shí)現(xiàn)類(lèi)都是這樣的實(shí)現(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 /*** 獲取請(qǐng)求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 {// 防止流讀取一次后就沒(méi)有了, 所以需要將流繼續(xù)寫(xiě)出去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
- 下一篇: 够快云库, 加速企业信息化建设