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

SpringBoot Filter修改返回內(nèi)容,解決請求卡死200的錯誤

 更新時間:2023年07月19日 10:25:35   作者:Meta39  
這篇文章主要介紹了SpringBoot Filter修改返回內(nèi)容,解決請求卡死200的錯誤問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot Filter修改返回內(nèi)容,解決請求卡死200

Filter

import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
/**
?* 過濾器
?*/
@Component
@WebFilter(urlPatterns = "/*", filterName = "testFilter")
public class TestFilter implements Filter {
? ? @Override
? ? public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
? ? ? ? HSRW hsrw = new HSRW((HttpServletResponse) response);//獲取返回內(nèi)容
? ? ? ? filterChain.doFilter(request, hsrw);//一定要放到獲取內(nèi)容前面,否則會沒有數(shù)據(jù)
? ? ? ? byte[] content = hsrw.getContent();//response流的內(nèi)容
? ? ? ? String str = new String(content, StandardCharsets.UTF_8);
? ? ? ? System.out.println("原返回值:" + str);
?? ??? ?String newStr = "哈哈哈哈哈哈";
? ? ? ? //修改返回內(nèi)容長度,解決返回內(nèi)容長度不一致導(dǎo)致請求卡住的問題
? ? ? ? response.setContentLength(newStr.getBytes(StandardCharsets.UTF_8).length);//這里要注意:setContentLength(字符串的字節(jié)長度,不是字符串的長度)
? ? ? ? //修改完寫入輸出流,返回給前端
? ? ? ? //JDK8寫法
? ? ? ? try (ServletOutputStream out = response.getOutputStream()) {
? ? ? ? ? ? out.write(newStr.getBytes(StandardCharsets.UTF_8));//寫入返回內(nèi)容
? ? ? ? ? ? out.flush();//刷新
? ? ? ? }
? ? ? ? //JDK8之前的寫法
? ? ? ? /*ServletOutputStream out = response.getOutputStream();
? ? ? ? out.write(newStr.getBytes(StandardCharsets.UTF_8));//寫入返回內(nèi)容
? ? ? ? out.flush();//刷新
? ? ? ? out.close();//關(guān)閉流*/
? ? }
}

繼承HttpServletResponseWrapper重寫方法獲取返回內(nèi)容

import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;
public class HSRW extends HttpServletResponseWrapper {
? ? private final ByteArrayOutputStream buffer;
? ? private final ServletOutputStream out;
? ? public HSRW(HttpServletResponse httpServletResponse) {
? ? ? ? super(httpServletResponse);
? ? ? ? buffer = new ByteArrayOutputStream();
? ? ? ? out = new WrapperOutputStream(buffer);
? ? }
? ? @Override
? ? public ServletOutputStream getOutputStream() {
? ? ? ? return out;
? ? }
? ? @Override
? ? public void flushBuffer() throws IOException {
? ? ? ? if (out != null) {
? ? ? ? ? ? out.flush();
? ? ? ? }
? ? }
? ? public byte[] getContent() throws IOException {
? ? ? ? flushBuffer();
? ? ? ? return buffer.toByteArray();
? ? }
? ? static class WrapperOutputStream extends ServletOutputStream {
? ? ? ? private final ByteArrayOutputStream bos;
? ? ? ? public WrapperOutputStream(ByteArrayOutputStream bos) {
? ? ? ? ? ? this.bos = bos;
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void write(int b) {
? ? ? ? ? ? bos.write(b);
? ? ? ? }
? ? ? ? @Override
? ? ? ? public boolean isReady() {
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void setWriteListener(WriteListener arg0) {
? ? ? ? }
? ? }
}

測試

沒修改前

Meta,你好!

修改后

哈哈哈哈哈哈

  • 修改完內(nèi)容卡200是因為沒有重新設(shè)置內(nèi)容長度
  • 修改完內(nèi)容返回中文亂碼問題,其實不是亂碼問題是你設(shè)置的長度不是字符串的字節(jié)長度導(dǎo)致的。改成字符串的字節(jié)長度即可。
  • 沒有數(shù)據(jù)可能是filterChain.doFilter(request, hsrw);位置放錯了,要放到獲取內(nèi)容之前,如果放到獲取內(nèi)容之后,則相當(dāng)于獲取的內(nèi)容為空

SpringBoot使用過濾器Filter,修改返回值會出現(xiàn)返回值截斷缺失

問題原因

原本的ServletResponse response中Content長度小于修改的長度。

當(dāng)使用ServletOutputStream out修改返回值的時候,超過原Content長度的部分會被截斷

解決方法

是在將新內(nèi)容寫入前改變Content的長度:

response.setContentLength(strChange.length());
ServletOutputStream out = response.getOutputStream();
out.write(strChange.getBytes());
out.flush();

總結(jié)

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

相關(guān)文章

  • Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用

    Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用

    Spring?Boot2.6.0為我們帶來很多好用的新特性/改進,這篇文章主要給大家介紹了關(guān)于Spring?Boot2.6.0新特性之默認(rèn)禁止循環(huán)引用的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • Java構(gòu)建乘積數(shù)組的方法

    Java構(gòu)建乘積數(shù)組的方法

    這篇文章主要為大家詳細(xì)介紹了Java構(gòu)建乘積數(shù)組的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • java字符串與格式化輸出的深入分析

    java字符串與格式化輸出的深入分析

    本篇文章是對java字符串與格式化輸出進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • springMVC利用FastJson接口返回json數(shù)據(jù)相關(guān)配置詳解

    springMVC利用FastJson接口返回json數(shù)據(jù)相關(guān)配置詳解

    本篇文章主要介紹了springMVC利用FastJson接口返回json數(shù)據(jù)相關(guān)配置詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java實現(xiàn)Word、Excel、PDF文件在線預(yù)覽幾種實現(xiàn)方式

    Java實現(xiàn)Word、Excel、PDF文件在線預(yù)覽幾種實現(xiàn)方式

    在Web開發(fā)中,經(jīng)常需要實現(xiàn)文件的在線預(yù)覽功能,比如預(yù)覽PDF、Word、Excel等文檔格式,這篇文章主要介紹了Java實現(xiàn)Word、Excel、PDF文件在線預(yù)覽幾種實現(xiàn)方式的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • 淺談Java安全編碼之文件和共享目錄的安全性

    淺談Java安全編碼之文件和共享目錄的安全性

    Java程序是跨平臺的,可以運行在windows也可以運行在linux。但是平臺不同,平臺中的文件權(quán)限也是不同的。windows大家經(jīng)常使用,并且是可視化的權(quán)限管理,這里就不多講了。本文主要講講linux下面的文件的權(quán)限和安全性問題,并且探討一下如何在java程序中考慮文件的安全性
    2021-06-06
  • Java switch語句的使用詳解

    Java switch語句的使用詳解

    Java switch語句隨JDK演進支持int/char、String及模式匹配,具備表達式限制、穿透控制、作用域隔離等特性,適用于狀態(tài)機、命令解析等場景,需注意類型兼容性及break使用,推薦使用箭頭語法和編譯器優(yōu)化提升代碼質(zhì)量
    2025-07-07
  • Java反射如何修改private final成員變量值

    Java反射如何修改private final成員變量值

    這篇文章主要介紹了Java反射如何修改private final成員變量值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • 詳解Java中Array和ArrayList的比較和轉(zhuǎn)換

    詳解Java中Array和ArrayList的比較和轉(zhuǎn)換

    在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結(jié)構(gòu),用來存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點極大地影響應(yīng)用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強項和弱點,,需要的朋友可以參考下
    2023-08-08
  • 解析Mybatis Porxy動態(tài)代理和sql解析替換問題

    解析Mybatis Porxy動態(tài)代理和sql解析替換問題

    這篇文章主要介紹了Mybatis Porxy動態(tài)代理和sql解析替換,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04

最新評論

定安县| 义乌市| 乐业县| 肇庆市| 宁安市| 花莲市| 东方市| 葫芦岛市| 赤城县| 榆中县| 咸阳市| 格尔木市| 洪江市| 荃湾区| 新余市| 临澧县| 樟树市| 金沙县| 砚山县| 探索| 宜都市| 盐池县| 门头沟区| 辉南县| 新乡县| 黔西县| 民勤县| 图木舒克市| 温宿县| 青海省| 和平县| 阿克陶县| 西藏| 韩城市| 阆中市| 宿迁市| 呼伦贝尔市| 隆回县| 密山市| 哈密市| 彭山县|