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

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

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

場景描述

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

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

報錯內(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);
    }
}
// 獲取請求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é)

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

相關(guān)文章

  • mybatis模糊查詢like語句該如何寫

    mybatis模糊查詢like語句該如何寫

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

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

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

    JVM的垃圾回收機制真是通俗易懂

    這篇文章主要為大家詳細介紹了JVM的垃圾回收機制,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 解決@PathVariable對于特殊字符截斷的問題

    解決@PathVariable對于特殊字符截斷的問題

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

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

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

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

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

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

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

    SpringMVC配置多個properties文件之通配符解析

    這篇文章主要介紹了SpringMVC配置多個properties文件之通配符解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    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ā)有時候cmd不支持bash命令,有些操作就會非常麻煩,本文主要介紹了IDEA更改Terminal的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09

最新評論

九龙坡区| 绥阳县| 阿图什市| 永顺县| 介休市| 和平区| 长治县| 思南县| 琼中| 玉树县| 仲巴县| 岳阳市| 长泰县| 舒兰市| 马关县| 庄河市| 垦利县| 漳浦县| 栖霞市| 永丰县| 信阳市| 桃园县| 高台县| 晋城| 大埔区| 靖安县| 绩溪县| 杨浦区| 余江县| 嘉祥县| 三台县| 仁寿县| 改则县| 阜宁县| 七台河市| 黄平县| 内江市| 乌拉特中旗| 岱山县| 九江县| 会同县|