亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

post請(qǐng)求體內(nèi)容無(wú)法重復(fù)獲取

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

以tomcat為例,在進(jìn)行請(qǐng)求體讀取時(shí)實(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)行讀取時(shí)

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;
}

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

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

public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
		// 存儲(chǔ)請(qǐng)求體
    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;
    }

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

  // 重寫讀取,從存儲(chǔ)的字節(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請(qǐng)求內(nèi)容無(wú)法重復(fù)獲取的解決方法的文章就介紹到這了,更多相關(guān)post請(qǐng)求無(wú)法重復(fù)獲取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java浮點(diǎn)類數(shù)字運(yùn)算方式

    Java浮點(diǎn)類數(shù)字運(yùn)算方式

    在進(jìn)行浮點(diǎn)數(shù)的加減運(yùn)算時(shí),直接使用+和-可能會(huì)引入精度誤差,為了比較浮點(diǎn)數(shù),可以使用Double的compareTo()方法,或者通過定義一個(gè)容差值(Epsilon)來(lái)判斷兩個(gè)浮點(diǎn)數(shù)是否相等,此外,Double.compare()方法也能比較兩個(gè)double值
    2024-10-10
  • 解析java中This的用法分析

    解析java中This的用法分析

    本篇文章是對(duì)java中This的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • WIN7系統(tǒng)JavaEE(tomcat7 Eclipse)環(huán)境配置教程(二)

    WIN7系統(tǒng)JavaEE(tomcat7 Eclipse)環(huán)境配置教程(二)

    這篇文章主要介紹了WIN7系統(tǒng)JavaEE(java+tomcat7+Eclipse)環(huán)境配置教程,本文重點(diǎn)在于tomcat配置、Eclipse配置,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java 圖解Spring啟動(dòng)時(shí)的后置處理器工作流程是怎樣的

    Java 圖解Spring啟動(dòng)時(shí)的后置處理器工作流程是怎樣的

    spring的后置處理器有兩類,bean后置處理器,bf(BeanFactory)后置處理器。bean后置處理器作用于bean的生命周期,bf的后置處理器作用于bean工廠的生命周期
    2021-10-10
  • java的繼承原理與實(shí)現(xiàn)方法詳解

    java的繼承原理與實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了java的繼承原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式詳細(xì)分析了Java繼承的概念、原理、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-05-05
  • java并發(fā)編程專題(一)----線程基礎(chǔ)知識(shí)

    java并發(fā)編程專題(一)----線程基礎(chǔ)知識(shí)

    這篇文章主要介紹了java并發(fā)編程線程的基礎(chǔ)知識(shí),文中講解非常詳細(xì),幫助大家更好的學(xué)習(xí)JAVA并發(fā)編程,感興趣想學(xué)習(xí)JAVA的可以了解下
    2020-06-06
  • springcloud之Feign超時(shí)問題的解決

    springcloud之Feign超時(shí)問題的解決

    這篇文章主要介紹了springcloud之Feign超時(shí)問題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)

    在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)

    本文將介紹如何在Spring Boot項(xiàng)目中集成RabbitMQ,實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的基本配置,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • Spring Boot Redis客戶端遠(yuǎn)程操作實(shí)現(xiàn)過程解析

    Spring Boot Redis客戶端遠(yuǎn)程操作實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Spring Boot Redis客戶端遠(yuǎn)程操作實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Redis使用RedisTemplate模板類的常用操作方式

    Redis使用RedisTemplate模板類的常用操作方式

    這篇文章主要介紹了Redis使用RedisTemplate模板類的常用操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論