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

解決異常處理問題:getReader()?has?already?been?called?for?this

 更新時(shí)間:2024年01月30日 08:33:00   作者:magic_kid_2010  
這篇文章主要介紹了解決異常處理:getReader()?has?already?been?called?for?this問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

場(chǎng)景描述

在 Spring Boot 自定義攔截器中,需要對(duì)請(qǐng)求 body 中的內(nèi)容做簽名驗(yàn)證。

在日志切面中,需要打印請(qǐng)求 body 中的內(nèi)容。

報(bào)錯(cuò)內(nèi)容

java.lang.IllegalStateException: getReader() has already been called for this request
    at org.apache.catalina.connector.Request.getInputStream(Request.java:1069)
    at org.apache.catalina.connector.RequestFacade.getInputStream(RequestFacade.java:365)
    at com.igg.aggregate.server.aspect.LogAspect.before(LogAspect.java:80)

原因分析

HttpServletRequest 的 getInputStream() 和 getReader() 都只能讀取一次,由于 Request Body 是流的形式讀取,那么

流讀了一次就沒有了,所以只能被調(diào)用一次。

解決辦法

先將 Request Body 保存,然后通過 Servlet 自帶的 HttpServletRequestWrapper 類覆蓋 getReader() 和

getInputStream() 方法,使流從保存的body讀取。

然后再Filter中將ServletRequest替換為AuthenticationRequestWrapper。

代碼示例:

public class MyRequestWrapper extends HttpServletRequestWrapper {
    private byte[] body;
 
    public MyRequestWrapper(HttpServletRequest request) throws IOException {
        super(request);
 
        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(body, StandardCharsets.UTF_8);
    }
}
// 獲取請(qǐng)求body
try {
     MyRequestWrapper myRequestWrapper = new MyRequestWrapper(request);
     return myRequestWrapper.getBody();
} catch (IOException e) {
     log.error("get request body exception", e);
     throw new RuntimeException(e);
}

總結(jié)

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

相關(guān)文章

  • mybatis模糊查詢like語(yǔ)句該如何寫

    mybatis模糊查詢like語(yǔ)句該如何寫

    MyBatis模糊查詢通常使用LIKE關(guān)鍵字,結(jié)合concat函數(shù)拼接通配符%實(shí)現(xiàn),在MyBatis配置文件中,通過#{keyword}傳遞參數(shù),生成帶有通配符的查詢語(yǔ)句,MyBatis-Plus中,通過LambdaQueryWrapper類和like方法構(gòu)建模糊查詢條件,簡(jiǎn)化查詢操作
    2024-09-09
  • Java中Arrays數(shù)組工具類的基本使用詳解

    Java中Arrays數(shù)組工具類的基本使用詳解

    Arrays類中的方法都是static修飾的靜態(tài)方法,在使用的時(shí)候可以直接使用類名進(jìn)行調(diào)用,而"不用"使用對(duì)象來調(diào)用(注意:是"不用"?而不是?"不能"),這篇文章主要給大家介紹了關(guān)于Java中Arrays數(shù)組工具類的基本使用,需要的朋友可以參考下
    2021-12-12
  • JVM的垃圾回收機(jī)制真是通俗易懂

    JVM的垃圾回收機(jī)制真是通俗易懂

    這篇文章主要為大家詳細(xì)介紹了JVM的垃圾回收機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 解決@PathVariable對(duì)于特殊字符截?cái)嗟膯栴}

    解決@PathVariable對(duì)于特殊字符截?cái)嗟膯栴}

    這篇文章主要介紹了解決@PathVariable對(duì)于特殊字符截?cái)嗟膯栴},具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中try-catch-finally執(zhí)行順序你知道嗎

    Java中try-catch-finally執(zhí)行順序你知道嗎

    本文主要介紹了try-catch-finally執(zhí)行順序你知道嗎,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • SpringBoot整合Jasypt實(shí)現(xiàn)配置文件和數(shù)據(jù)庫(kù)字段敏感數(shù)據(jù)的加解密

    SpringBoot整合Jasypt實(shí)現(xiàn)配置文件和數(shù)據(jù)庫(kù)字段敏感數(shù)據(jù)的加解密

    很多時(shí)候?yàn)榱吮WC數(shù)據(jù)的安全,在處理敏感數(shù)據(jù)、前后端數(shù)據(jù)傳輸、數(shù)據(jù)庫(kù)敏感數(shù)據(jù)入庫(kù)等,數(shù)據(jù)的加密和解密是不可忽視的重要環(huán)節(jié),下面我們就來看看如何在SpringBoot整合Jasypt實(shí)現(xiàn)配置文件和數(shù)據(jù)庫(kù)字段敏感數(shù)據(jù)的加解密吧
    2025-09-09
  • Servlet開發(fā)JavaWeb工程示例詳解

    Servlet開發(fā)JavaWeb工程示例詳解

    這篇文章主要介紹了Servlet開發(fā)JavaWeb工程示例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringMVC配置多個(gè)properties文件之通配符解析

    SpringMVC配置多個(gè)properties文件之通配符解析

    這篇文章主要介紹了SpringMVC配置多個(gè)properties文件之通配符解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • MySql多表查詢 事務(wù)及DCL

    MySql多表查詢 事務(wù)及DCL

    這篇文章主要介紹了MySql多表查詢 、事務(wù)、DCL的相關(guān)資料,需要的朋友可以參考下面文章內(nèi)容
    2021-09-09
  • IDEA更改Terminal的方法步驟

    IDEA更改Terminal的方法步驟

    Windows上開發(fā)有時(shí)候cmd不支持bash命令,有些操作就會(huì)非常麻煩,本文主要介紹了IDEA更改Terminal的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09

最新評(píng)論

琼中| 松江区| 华蓥市| 手机| 仙游县| 威远县| 深州市| 凤城市| 新巴尔虎右旗| 甘德县| 综艺| 大方县| 民丰县| 蓝山县| 绥宁县| 鹤峰县| 封开县| 天峨县| 仁化县| 南川市| 丹江口市| 盘锦市| 靖西县| 常州市| 晋江市| 汉阴县| 绥棱县| 重庆市| 高碑店市| 大英县| 曲阜市| 丰台区| 九江县| 理塘县| 邵武市| 上思县| 大丰市| 张掖市| 汤阴县| 彭水| 铜山县|