欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死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;
/**
?* 過(guò)濾器
?*/
@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)容前面,否則會(huì)沒(mé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)容長(zhǎng)度,解決返回內(nèi)容長(zhǎng)度不一致導(dǎo)致請(qǐng)求卡住的問(wèn)題
? ? ? ? response.setContentLength(newStr.getBytes(StandardCharsets.UTF_8).length);//這里要注意:setContentLength(字符串的字節(jié)長(zhǎng)度,不是字符串的長(zhǎng)度)
? ? ? ? //修改完寫(xiě)入輸出流,返回給前端
? ? ? ? //JDK8寫(xiě)法
? ? ? ? try (ServletOutputStream out = response.getOutputStream()) {
? ? ? ? ? ? out.write(newStr.getBytes(StandardCharsets.UTF_8));//寫(xiě)入返回內(nèi)容
? ? ? ? ? ? out.flush();//刷新
? ? ? ? }
? ? ? ? //JDK8之前的寫(xiě)法
? ? ? ? /*ServletOutputStream out = response.getOutputStream();
? ? ? ? out.write(newStr.getBytes(StandardCharsets.UTF_8));//寫(xiě)入返回內(nèi)容
? ? ? ? out.flush();//刷新
? ? ? ? out.close();//關(guān)閉流*/
? ? }
}

繼承HttpServletResponseWrapper重寫(xiě)方法獲取返回內(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) {
? ? ? ? }
? ? }
}

測(cè)試

沒(méi)修改前

Meta,你好!

修改后

哈哈哈哈哈哈

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

SpringBoot使用過(guò)濾器Filter,修改返回值會(huì)出現(xiàn)返回值截?cái)嗳笔?/h2>

問(wèn)題原因

原本的ServletResponse response中Content長(zhǎng)度小于修改的長(zhǎng)度。

當(dāng)使用ServletOutputStream out修改返回值的時(shí)候,超過(guò)原Content長(zhǎng)度的部分會(huì)被截?cái)?/p>

解決方法

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

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

總結(jié)

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

相關(guān)文章

  • 詳解spring boot mybatis全注解化

    詳解spring boot mybatis全注解化

    這篇文章主要介紹了spring boot mybatis全注解化的相關(guān)資料,需要的朋友可以參考下
    2017-09-09
  • Intellij IDEA安裝lombok插件及使用詳解

    Intellij IDEA安裝lombok插件及使用詳解

    今天小編就為大家分享一篇關(guān)于Intellij IDEA安裝lombok插件及使用詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Kotlin 基礎(chǔ)語(yǔ)法詳細(xì)介紹

    Kotlin 基礎(chǔ)語(yǔ)法詳細(xì)介紹

    這篇文章主要介紹了Kotlin 基礎(chǔ)語(yǔ)法詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • java實(shí)現(xiàn)簡(jiǎn)單的給sql語(yǔ)句賦值的示例

    java實(shí)現(xiàn)簡(jiǎn)單的給sql語(yǔ)句賦值的示例

    這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單的給sql語(yǔ)句賦值的示例,需要的朋友可以參考下
    2014-05-05
  • Java枚舉(enum) 詳解7種常見(jiàn)的用法

    Java枚舉(enum) 詳解7種常見(jiàn)的用法

    這篇文章主要介紹了Java枚舉(enum) 詳解7種常見(jiàn)的用法,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-11-11
  • Java應(yīng)用程序CPU100%問(wèn)題排查優(yōu)化實(shí)戰(zhàn)

    Java應(yīng)用程序CPU100%問(wèn)題排查優(yōu)化實(shí)戰(zhàn)

    這篇文章主要介紹了如何排查和優(yōu)化Java應(yīng)用程序CPU使用率達(dá)到100%的問(wèn)題,文中通過(guò)代碼示例和圖文結(jié)合的方式講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2025-02-02
  • Spring異常捕獲且回滾事務(wù)解決方案

    Spring異常捕獲且回滾事務(wù)解決方案

    這篇文章主要介紹了Spring異常捕獲且回滾事務(wù)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Java多線程之線程狀態(tài)的遷移詳解

    Java多線程之線程狀態(tài)的遷移詳解

    線程狀態(tài)遷移,又常被稱作線程的生命周期,指的是線程從創(chuàng)建到終結(jié)需要經(jīng)歷哪些狀態(tài),什么情況下會(huì)出現(xiàn)哪些狀態(tài).線程的狀態(tài)直接關(guān)系著并發(fā)編程的各種問(wèn)題,本文就線程的狀態(tài)遷移做一初步探討,并總結(jié)在何種情況下會(huì)出現(xiàn)這些狀態(tài),需要的朋友可以參考下
    2021-06-06
  • Alibaba?Fastjson之超好用的JOSN解析庫(kù)

    Alibaba?Fastjson之超好用的JOSN解析庫(kù)

    這篇文章主要介紹了Alibaba?Fastjson之超好用的JOSN解析庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 繼承jpa?Repository?寫(xiě)自定義方法查詢實(shí)例

    繼承jpa?Repository?寫(xiě)自定義方法查詢實(shí)例

    這篇文章主要介紹了繼承jpa?Repository?寫(xiě)自定義方法查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評(píng)論