Java HttpServiceletRequest InputStreamをコピーする方法は2ステップで簡単にできます
なぜrequestオブジェクトのInputStreamまたはReaderが一度しか使用できないのか疑問に思うかもしれません.
原理は簡単で、流れを水にたとえることができて、requestの中のinputStreamはコップの中の水のようです.コップの水を捨ててからも注ぎ続けることができますか?もちろん垂らしてはいけません!InputStreamにはポインタと同期処理があり、ポインタが最後になると戻ってこない.では、request bodyのデータをどのようにコピーしますか.もちろん、Stringのようなコピー可能なストレージ方法を探さなければなりません.例えば、Stringは、requestのinputStreamをStringに変換してから、Stringをbyte[]に変換して保存すればいいです.Stringオブジェクトは無制限に使用できます.
はい、くだらないことは言わないで、コードをつけます.
1.まずフィルタを定義し、フィルタ自体を設定します.次に、フィルタのdoFilterメソッドで次の操作を行います.
2.これはMyHttpServertRequestWrapperクラスで、主にbody stringを格納し、requestオブジェクトにbyte[]:
OK、簡単でしょう.試してみてください.
原理は簡単で、流れを水にたとえることができて、requestの中のinputStreamはコップの中の水のようです.コップの水を捨ててからも注ぎ続けることができますか?もちろん垂らしてはいけません!InputStreamにはポインタと同期処理があり、ポインタが最後になると戻ってこない.では、request bodyのデータをどのようにコピーしますか.もちろん、Stringのようなコピー可能なストレージ方法を探さなければなりません.例えば、Stringは、requestのinputStreamをStringに変換してから、Stringをbyte[]に変換して保存すればいいです.Stringオブジェクトは無制限に使用できます.
はい、くだらないことは言わないで、コードをつけます.
1.まずフィルタを定義し、フィルタ自体を設定します.次に、フィルタのdoFilterメソッドで次の操作を行います.
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
try {
MyHttpServletRequestWrapper requestWrapper = new MyHttpServletRequestWrapper((HttpServletRequest) servletRequest);
System.out.println("RequestBody:" + requestWrapper.getBodyString());
filterChain.doFilter(requestWrapper, servletResponse);
} catch (IOException e) {
e.printStackTrace();
}
}
2.これはMyHttpServertRequestWrapperクラスで、主にbody stringを格納し、requestオブジェクトにbyte[]:
public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper {
private final byte[] body;
private String bodyString;
public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
super(request);
this.bodyString = StreamUtils.copyToString(request.getInputStream(), Charset.forName("UTF-8"));
body = bodyString.getBytes("UTF-8");
}
public String getBodyString() {
return this.bodyString;
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream bais = new ByteArrayInputStream(body);
return new ServletInputStream() {
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() throws IOException {
return bais.read();
}
};
}
}
OK、簡単でしょう.試してみてください.