SpringBoot Filter修改返回內(nèi)容,解決請(qǐng)求卡死200的錯(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)文章
java實(shí)現(xiàn)簡(jiǎn)單的給sql語(yǔ)句賦值的示例
這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單的給sql語(yǔ)句賦值的示例,需要的朋友可以參考下2014-05-05Java應(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-02Alibaba?Fastjson之超好用的JOSN解析庫(kù)
這篇文章主要介紹了Alibaba?Fastjson之超好用的JOSN解析庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10繼承jpa?Repository?寫(xiě)自定義方法查詢實(shí)例
這篇文章主要介紹了繼承jpa?Repository?寫(xiě)自定義方法查詢實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12