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

SpringBoot攔截器執(zhí)行后,Controller層不執(zhí)行的問(wèn)題及解決

 更新時(shí)間:2025年07月18日 16:20:25   作者:努力的雅木茶  
請(qǐng)求攔截器中若調(diào)用getInputStream()讀取流,會(huì)導(dǎo)致Controller層無(wú)法獲取請(qǐng)求體,引發(fā)400錯(cuò)誤,解決方案:避免在攔截器中讀取流,或使用緩存(如將流轉(zhuǎn)為字符串)確保數(shù)據(jù)可重復(fù)使用

問(wèn)題描述

請(qǐng)求在SpringBoot攔截器中執(zhí)行后,在Controller層不執(zhí)行,前端錯(cuò)誤碼400

原因分析

ServletRequest 中通過(guò)流獲取參數(shù)(getInputStream())只能讀取一次,

而@RequestBody注解也是根據(jù)流的形式獲取參數(shù)。

所以攔截器中 request 使用流獲取參數(shù)后,Controller中獲取不到參數(shù)

解決方案

// 攔截器中獲取請(qǐng)求
RequestWrapper myRequestWrapper = new RequestWrapper(request);
String JSONData = myRequestWrapper.getBody();
public class RequestWrapper extends HttpServletRequestWrapper {

    /**
     * 存儲(chǔ)請(qǐng)求數(shù)據(jù)
     */
    private String body;

    public RequestWrapper(HttpServletRequest request) {
        super(request);
        renewBody(request);
    }

    /**
     * 重寫(xiě)getInputStream方法
     * @return
     */
    @Override
    public ServletInputStream getInputStream() {
        final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
        ServletInputStream servletInputStream = 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 byteArrayInputStream.read();
            }
        };
        return servletInputStream;

    }

    /**
     * 重寫(xiě)getReader方法
     * @return
     */
    @Override
    public BufferedReader getReader() {
        return new BufferedReader(new InputStreamReader(this.getInputStream()));
    }

    /**
     * 讀取body的值
     * @param request
     */
    private void renewBody(HttpServletRequest request) {
        StringBuilder stringBuilder = new StringBuilder();
        BufferedReader bufferedReader = null;
        try {
            InputStream inputStream = request.getInputStream();
            if (inputStream != null) {
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                char[] charBuffer = new char[128];
                int bytesRead = -1;
                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                    stringBuilder.append(charBuffer, 0, bytesRead);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        }
        body = stringBuilder.toString();
    }

    public String getBody() {
        return body;
    }

}
@Component
public class HttpServletFilter implements Filter {


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        ServletRequest requestWrapper = null;
        if (servletRequest instanceof HttpServletRequest) {
            requestWrapper = new RequestWrapper((HttpServletRequest) servletRequest);
            System.out.println(((RequestWrapper) requestWrapper).getBody());
            // do something
        }
        if (requestWrapper == null) {
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            filterChain.doFilter(requestWrapper, servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

總結(jié)

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

相關(guān)文章

  • 解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問(wèn)題

    解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問(wèn)題

    這篇文章主要介紹了解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • IO流概述分類(lèi)字節(jié)流寫(xiě)數(shù)據(jù)三種方式及問(wèn)題分析

    IO流概述分類(lèi)字節(jié)流寫(xiě)數(shù)據(jù)三種方式及問(wèn)題分析

    這篇文章主要為大家介紹了IO流概述分類(lèi)字節(jié)流寫(xiě)數(shù)據(jù)三種方式及寫(xiě)數(shù)據(jù)問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳談Java枚舉、靜態(tài)導(dǎo)入、自動(dòng)拆裝箱、增強(qiáng)for循環(huán)、可變參數(shù)

    詳談Java枚舉、靜態(tài)導(dǎo)入、自動(dòng)拆裝箱、增強(qiáng)for循環(huán)、可變參數(shù)

    下面小編就為大家?guī)?lái)一篇詳談Java枚舉、靜態(tài)導(dǎo)入、自動(dòng)拆裝箱、增強(qiáng)for循環(huán)、可變參數(shù)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • SpringBoot中事半功倍的工具類(lèi)合集分享

    SpringBoot中事半功倍的工具類(lèi)合集分享

    在日常開(kāi)發(fā)中經(jīng)常有這樣那樣的小功能需要實(shí)現(xiàn),這些一般會(huì)作為工具類(lèi)存在,在項(xiàng)目中有一些通用的功能,Spring內(nèi)置了需要工具類(lèi),而且經(jīng)過(guò)了大量的驗(yàn)證,可以在開(kāi)發(fā)中助你一臂之力,快跟隨小編一起來(lái)看看吧
    2023-02-02
  • 一文徹底了解Java的組合模式

    一文徹底了解Java的組合模式

    組合模式(Composite?Pattern)指將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),?使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。本文就來(lái)帶大家深入了解一下Java的組合模式吧
    2023-02-02
  • java調(diào)用oracle分頁(yè)存儲(chǔ)過(guò)程示例

    java調(diào)用oracle分頁(yè)存儲(chǔ)過(guò)程示例

    這篇文章主要介紹了java調(diào)用oracle分頁(yè)存儲(chǔ)過(guò)程,需要的朋友可以參考下
    2014-03-03
  • 淺談java如何生成分享海報(bào)工具類(lèi)

    淺談java如何生成分享海報(bào)工具類(lèi)

    這篇文章主要介紹了淺談java如何生成分享海報(bào)工具類(lèi),想了解分享海報(bào)知識(shí)的同學(xué)不要錯(cuò)過(guò)哦
    2021-04-04
  • Flink實(shí)現(xiàn)往Kafka中多個(gè)topic發(fā)送消息

    Flink實(shí)現(xiàn)往Kafka中多個(gè)topic發(fā)送消息

    文章介紹了使用Flink 1.13.2 和 Kafka 2.6.2 從Kafka讀取數(shù)據(jù),并根據(jù)邏輯將數(shù)據(jù)分配到不同的topic,提到了需要重寫(xiě)FlinkKafka的Key序列化器,并加入自定義邏輯以發(fā)送消息到指定的topic,文中還包括了配置Kafka信息和如何連接FlinkKafka的步驟
    2025-10-10
  • Maven配置文件settings.xml的實(shí)現(xiàn)

    Maven配置文件settings.xml的實(shí)現(xiàn)

    Maven是一個(gè)用于構(gòu)建和管理Java項(xiàng)目的強(qiáng)大工具,它依賴(lài)于設(shè)置文件來(lái)配置和管理其行為,其中最重要的之一便是settings.xml文件,本文主要介紹了Maven配置文件settings.xml的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

    SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能

    小編最近實(shí)現(xiàn)一個(gè)功能基于springboot程序的支付寶支付demo,非常不錯(cuò)適合初學(xué)者入門(mén)學(xué)習(xí)使用,今天把SpringBoot實(shí)現(xiàn)簡(jiǎn)易支付寶網(wǎng)頁(yè)支付功能的示例代碼分享給大家,感興趣的朋友參考下吧
    2021-10-10

最新評(píng)論

若羌县| 丰都县| 胶南市| 宜阳县| 河津市| 临邑县| 留坝县| 赣州市| 泽普县| 临邑县| 博罗县| 大新县| 许昌市| 横山县| 民权县| 瑞金市| 恭城| 泾阳县| 会理县| 辉县市| 霞浦县| 曲阳县| 红河县| 遵义县| 宁国市| 台南市| 林州市| 武山县| 阳城县| 稻城县| 三明市| 长宁县| 扶风县| 汕尾市| 介休市| 含山县| 嘉黎县| 顺义区| 惠安县| 新野县| 安丘市|