最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于post請求內(nèi)容無法重復(fù)獲取的解決方法

 更新時間:2024年03月04日 11:09:49   作者:isfox  
這篇文章主要介紹了關(guān)于post請求內(nèi)容無法重復(fù)獲取的解決方法,文中通過代碼示例給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

post請求體內(nèi)容無法重復(fù)獲取

為什么會無法重復(fù)讀取呢?

以tomcat為例,在進(jìn)行請求體讀取時實(shí)際底層調(diào)用的是org.apache.catalina.connector.Request的getInputStream()方法,而該方法返回的是CoyoteInputStream輸入流

public ServletInputStream getInputStream() throws IOException {

    if (usingReader) {
        throw new IllegalStateException(sm.getString("coyoteRequest.getInputStream.ise"));
    }

    usingInputStream = true;
    if (inputStream == null) {
        inputStream = new CoyoteInputStream(inputBuffer);
    }
    return inputStream;

}

在使用CoyoteInputStream進(jìn)行讀取時

public int read(byte[] b, int off, int len) throws IOException {
  // 如果流關(guān)閉,則拋出異常
    if (closed) {
        throw new IOException(sm.getString("inputBuffer.streamClosed"));
    }
// 如果已經(jīng)讀完了,則返回-1
    if (checkByteBufferEof()) {
        return -1;
    }
    int n = Math.min(len, bb.remaining());
    bb.get(b, off, n);
    return n;
}

而流讀取完畢都會進(jìn)行close,這個流close之后,close狀態(tài)就置為了true,所以導(dǎo)致流無法進(jìn)行二次讀取

那么如何解決呢?將tomcat的Request類進(jìn)行重新實(shí)現(xiàn)嗎?代價太大了,sun公司當(dāng)初在設(shè)計(jì)的時候就已經(jīng)提供了解決方法,對于請求和響應(yīng),sun公司提供了包裝類,可以HttpServletRequestWrapper類包裝原始的request對象,實(shí)現(xiàn)了HttpServletRequest接口的所有方法,內(nèi)部調(diào)用了所包裝的request對象的對應(yīng)方法;相應(yīng)的也有HttpServletResponseWrapper類來包裝原始的response對象繼承HttpServletRequestWrapper來進(jìn)行方法重寫,可以使用HttpServletResponseWrapper和HttpServletRequestWrapper來進(jìn)行定制響應(yīng)和請求

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
		// 存儲請求體
    private byte[] body;

    private HttpServletRequest orgRequest;

    public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        this.orgRequest = request;
        body = HttpHelper.getBody(request);
    }

    public HttpServletRequest getOrgRequest() {
        return this.orgRequest;
    }

  // 重寫讀取,從存儲的字節(jié)數(shù)組中讀
    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

  // 重寫讀取,從存儲的字節(jié)數(shù)組中讀
    @Override
    public ServletInputStream getInputStream() throws IOException {

        final ByteArrayInputStream bais = new ByteArrayInputStream(body);

        return new ServletInputStream() {

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

            @Override
            public boolean isFinished() {
                return false;
            }

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

            @Override
            public void setReadListener(ReadListener readListener) {

            }
        };
    }
}

到此這篇關(guān)于關(guān)于post請求內(nèi)容無法重復(fù)獲取的解決方法的文章就介紹到這了,更多相關(guān)post請求無法重復(fù)獲取內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java中的構(gòu)造方法(構(gòu)造函數(shù))與普通方法區(qū)別及說明

    Java中的構(gòu)造方法(構(gòu)造函數(shù))與普通方法區(qū)別及說明

    這篇文章主要介紹了Java中的構(gòu)造方法(構(gòu)造函數(shù))與普通方法區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Mac電腦安裝多個JDK版本的詳細(xì)圖文教程

    Mac電腦安裝多個JDK版本的詳細(xì)圖文教程

    目前使用的主流版本還是JDK 8,但偶爾會想體驗(yàn)下新版本(或者舊版本),如果能裝多個版本的JDK,而且很方便的切換就好了,這篇文章主要給大家介紹了關(guān)于Mac電腦安裝多個JDK版本的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Java接口統(tǒng)一樣式返回模板的實(shí)現(xiàn)

    Java接口統(tǒng)一樣式返回模板的實(shí)現(xiàn)

    這篇文章主要介紹了Java接口統(tǒng)一樣式返回模板的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 關(guān)于Java中static關(guān)鍵字的用法

    關(guān)于Java中static關(guān)鍵字的用法

    這篇文章主要介紹了關(guān)于Java中static關(guān)鍵字的用法,static:意為靜態(tài)的,在?Java?里面作為靜態(tài)修飾符,可以理解為全局的意思,static?不僅可以修飾成員變量,成員方法,還可以修飾代碼塊,需要的朋友可以參考下
    2023-08-08
  • SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過程

    SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過程

    這篇文章主要介紹了SpringCloud之LoadBalancer負(fù)載均衡服務(wù)調(diào)用過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • 詳解Mybatis框架SQL防注入指南

    詳解Mybatis框架SQL防注入指南

    這篇文章主要介紹了詳解Mybatis框架SQL防注入指南,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • IntelliJ IDEA Run時報“無效的源發(fā)行版:16“錯誤問題及解決方法

    IntelliJ IDEA Run時報“無效的源發(fā)行版:16“錯誤問題及解決方法

    這篇文章主要介紹了IntelliJ IDEA Run時報“無效的源發(fā)行版:16“錯誤問題及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Java中典型的內(nèi)存泄露問題和解決方法

    Java中典型的內(nèi)存泄露問題和解決方法

    這篇文章主要介紹了Java中典型的內(nèi)存泄露問題和解決方法,典型的內(nèi)存泄露例子是一個沒有實(shí)現(xiàn)hasCode和 equals方法的Key類在HashMap中保存的情況,可以通過實(shí)現(xiàn)Key類的equals和hasCode方法解決這種內(nèi)存泄漏問題,需要的朋友可以參考下
    2014-04-04
  • Java躲不過設(shè)計(jì)模式的坑之代理模式詳解

    Java躲不過設(shè)計(jì)模式的坑之代理模式詳解

    設(shè)計(jì)模式看來更像是一種設(shè)計(jì)思維或設(shè)計(jì)思想,為你的項(xiàng)目工程提供方向,讓你的項(xiàng)目工程更加健壯、靈活,延續(xù)生命力。本文即將分享的是設(shè)計(jì)模式的其中一種:代理模式,感興趣的可以了解一下
    2022-09-09
  • SpringBoot+Mybatis Plus導(dǎo)致PageHelper失效的解決方法

    SpringBoot+Mybatis Plus導(dǎo)致PageHelper失效的解決方法

    在Springboot項(xiàng)目中使用分頁插件的時候,發(fā)現(xiàn)PageHelper插件失效了 ,本文主要介紹了SpringBoot+Mybatis Plus導(dǎo)致PageHelper失效的解決方法,感興趣的可以了解一下
    2024-07-07

最新評論

钟祥市| 昌宁县| 德钦县| 台湾省| 方山县| 通州区| 新绛县| 元江| 隆尧县| 佛学| 洛浦县| 镇坪县| 阿合奇县| 常州市| 锡林浩特市| 昂仁县| 喀什市| 尉犁县| 海南省| 东阳市| 石河子市| 仲巴县| 汝阳县| 克拉玛依市| 称多县| 通许县| 中阳县| 乃东县| 太仆寺旗| 乐业县| 石楼县| 清流县| 迁西县| 桃江县| 本溪| 漳浦县| 玛沁县| 凉城县| 乐安县| 汉源县| 留坝县|