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

如何解決getReader() has already been called for this request問(wèn)題

 更新時(shí)間:2024年05月11日 09:55:35   作者:終遇你..  
這篇文章主要介紹了如何解決getReader() has already been called for this request問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

解決getReader() has already been called for this request

在 Filter 中對(duì) request 中的 body 進(jìn)行參數(shù)簽名校驗(yàn)

會(huì)報(bào)如下錯(cuò)誤:

getReader() has already been called for this request

原因是

request.getReader() 和 request.getInputStream() 都是只能調(diào)用一次

并且 getReader() 方法底層也是調(diào)用 getInputStream() 來(lái)實(shí)現(xiàn)的.

所以我們要使用 HttpServletRequestWrapper 來(lái)實(shí)現(xiàn)自定義的 CustomHttpServletRequestWrapper, 把 body 保存在 CustomHttpServletRequestWrapper 中, 并且重寫 getInputStream() 方法

重寫  HttpServletRequestWrapper

package com.fosung.pb.village.config;
 
import org.apache.commons.fileupload.servlet.ServletFileUpload;
 
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
 
public class MyRequestWrapper extends HttpServletRequestWrapper {
 
    private byte[] body;
    public MyRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
        if(ServletFileUpload.isMultipartContent(request)){
            return;
        }
        StringBuilder sb = new StringBuilder();
        String line;
        BufferedReader reader = request.getReader();
        while ((line = reader.readLine()) != null) {
            sb.append(line);
        }
        String body = sb.toString();
        this.body = body.getBytes(StandardCharsets.UTF_8);
    }
    public String getBody() {
        return new String(this.body , StandardCharsets.UTF_8) ;
    }
    @Override
    public ServletInputStream getInputStream() {
        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(){
                return bais.read();
            }
        };
    }
    @Override
    public BufferedReader getReader(){
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }
}

Filter 使用

package com.fosung.pb.village.config;
 
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
 
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
 
/**
 * @author lanx
 * @date 2022/4/11
 */
@Slf4j
@Component
@WebFilter(filterName = "AntiSqlInjectionfilter", urlPatterns = "/*")
public class AntiSqlInjectionfilter implements Filter {
 
    public void destroy() {
        // TODO Auto-generated method stub
    }
 
    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
    }
 
 
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        MyRequestWrapper myRequestWrapper = null;
        // 獲取請(qǐng)求body
        try {
            myRequestWrapper = new MyRequestWrapper(req);
        } catch (IOException e) {
            log.error("get request body exception", e);
            throw new RuntimeException(e);
        }
 
        if ("POST".equalsIgnoreCase(req.getMethod())) {
            String param = myRequestWrapper.getBody();
            chain.doFilter(myRequestWrapper, response);
        } else {
            chain.doFilter(myRequestWrapper, response);
        }
    }
    
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Spring數(shù)據(jù)單元配置過(guò)程解析

    Java Spring數(shù)據(jù)單元配置過(guò)程解析

    這篇文章主要介紹了Java Spring數(shù)據(jù)單元配置過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解

    Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解

    這篇文章主要介紹了Java請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向區(qū)別詳解,請(qǐng)求轉(zhuǎn)發(fā)和請(qǐng)求重定向,但二者是完全不同的,所以我們今天就來(lái)盤他們的區(qū)別介紹,需要的朋友可以參考一下
    2022-07-07
  • SpringBoot集成RocketMQ發(fā)送事務(wù)消息的原理解析

    SpringBoot集成RocketMQ發(fā)送事務(wù)消息的原理解析

    RocketMQ 的事務(wù)消息提供類似 X/Open XA 的分布事務(wù)功能,通過(guò)事務(wù)消息能達(dá)到分布式事務(wù)的最終一致,這篇文章主要介紹了SpringBoot集成RocketMQ發(fā)送事務(wù)消息,需要的朋友可以參考下
    2022-06-06
  • 華為技術(shù)專家講解JVM內(nèi)存模型(收藏)

    華為技術(shù)專家講解JVM內(nèi)存模型(收藏)

    這篇文章主要介紹了華為技術(shù)專家講解JVM內(nèi)存模型(收藏)的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),具有一定的收藏借鑒價(jià)值,需要的朋友可以參考下
    2021-05-05
  • Java 異步線程監(jiān)聽(tīng)與結(jié)果回調(diào)及異常捕獲總結(jié)分析

    Java 異步線程監(jiān)聽(tīng)與結(jié)果回調(diào)及異常捕獲總結(jié)分析

    異常是程序之中導(dǎo)致程序中斷的一種指令流,異常一旦出現(xiàn)并且沒(méi)有進(jìn)行合理處理的話,那么程序就將中斷執(zhí)行,這篇文章綜合介紹了異步線程監(jiān)聽(tīng)與結(jié)果回調(diào)及異常捕獲
    2021-11-11
  • MyBatis解決模糊查詢包含特殊字符問(wèn)題

    MyBatis解決模糊查詢包含特殊字符問(wèn)題

    這篇文章主要介紹了MyBatis解決模糊查詢包含特殊字符問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Java中避免空指針異常的方法

    Java中避免空指針異常的方法

    這篇文章主要介紹了Java中避免空指針異常的方法,本文討論Optional類型、Objects類等技術(shù),需要的朋友可以參考下
    2014-10-10
  • JAVA如何解決并發(fā)問(wèn)題

    JAVA如何解決并發(fā)問(wèn)題

    這篇文章主要介紹了JAVA如何解決并發(fā)問(wèn)題的處理方法,文中講解的非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Zookeeper事務(wù)日志預(yù)分配空間解讀

    Zookeeper事務(wù)日志預(yù)分配空間解讀

    這篇文章主要介紹了Zookeeper事務(wù)日志預(yù)分配空間解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法

    詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法

    本篇文章主要介紹了詳解Spring Cloud負(fù)載均衡重要組件Ribbon中重要類的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評(píng)論

南宁市| 繁昌县| 息烽县| 海原县| 安康市| 阿克陶县| 太康县| 辽宁省| 罗甸县| 蓬安县| 邹城市| 旅游| 泸定县| 沭阳县| 乌恰县| 蒙城县| 喀喇沁旗| 万载县| 浪卡子县| 周口市| 白银市| 沂源县| 习水县| 五指山市| 凤冈县| 电白县| 咸丰县| 红安县| 万山特区| 资源县| 凌海市| 晋中市| 南充市| 扶沟县| 乐亭县| 都兰县| 望谟县| 高淳县| 贡嘎县| 綦江县| 乌鲁木齐县|