欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
request.getInputStream()輸入流反復讀取

問(wèn)題

Spring MVC模式,到達Controller之前,還有filter和interceptor;如果filter和interceptor,做了一些通用處理,先讀取了請求中的inputSteam,Controller再去讀取的會(huì )報錯

  • 報錯

解決

封裝一個(gè)Wrapper,保存最初inputStream讀取出來(lái)的private byte[] buffer,每次取inputStream的時(shí)候,返回一個(gè)新的new BufferedServletInputStream(this.buffer);
然后把這個(gè)Wrapper往下傳遞

public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {

    private byte[] buffer;

    public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        InputStream is = request.getInputStream();
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        byte[] tmp = new byte[1024];
        int read;
        while ((read = is.read(tmp)) > 0) {
            os.write(tmp, 0, read);
        }
        this.buffer = os.toByteArray();
    }

    @Override
    public ServletInputStream getInputStream() {
        return new BufferedServletInputStream(this.buffer);
    }
}
public class BufferedServletInputStream extends ServletInputStream {
    private ByteArrayInputStream inputStream;

    public BufferedServletInputStream(byte[] buffer) {
        this.inputStream = new ByteArrayInputStream(buffer);
    }

    @Override
    public int available() {
        return inputStream.available();
    }

    @Override
    public int read() throws IOException {
        return inputStream.read();
    }

    @Override
    public boolean isFinished() {
        return inputStream.available() == 0;
    }

    @Override
    public boolean isReady() {
        return true;
    }

    @Override
    public void setReadListener(ReadListener listener) {
        throw new RuntimeException("Not implemented");
    }
}
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = new BufferedServletRequestWrapper((HttpServletRequest) request);
        ......讀取request中的流......
        request.getInputStream();
        ......
        chain.doFilter(httpRequest, response);
    }

原因

流的讀取本身是單向的,所以只能將流的內容讀取處理,放入 byte[] 中緩存起來(lái),然后每次 getInputStream 都利用 ByteArrayOutputStream 來(lái)構造 InputStream, 達到了類(lèi)似反復讀取流的效果,其實(shí)是一直構造新的 ByteArrayOutputStream 進(jìn)行讀取

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Required request body is missing ...ContentCachingRequestWrapper
 SpringBoot 配置獲取request中body的json格式參數
Xposed-插件開(kāi)發(fā)(二)
Glide(圖片異步加載緩存庫)的方法介紹
徹底轉變流,第 1 部分
java從輸入流中獲取數據并返回字節數組示例
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久