利用過濾器修改response中的返回值
更新時間:2024年12月12日 14:31:16 作者:aiyongbo123456
文章介紹了如何通過繼承HttpServletResponseWrapper并重寫Response對象的方法來獲取response中的返回值,同時還分享了如何配置過濾器
過濾器修改response的返回值
1. 繼承HttpServletResponseWrapper
重新覆蓋Response對象,用來獲取response中的返回值

package com.example.demo.wrapper;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.*;
public class ResponseWrapper extends HttpServletResponseWrapper {
private ByteArrayOutputStream buffer = null;
private ServletOutputStream out = null;
private PrintWriter writer = null;
public ResponseWrapper(HttpServletResponse resp) throws IOException {
super(resp);
buffer = new ByteArrayOutputStream();// 真正存儲數(shù)據(jù)的流
out = new WapperedOutputStream(buffer);
writer = new PrintWriter(new OutputStreamWriter(buffer));
}
@Override
public ServletOutputStream getOutputStream() throws IOException {
return out;
}
@Override
public PrintWriter getWriter() throws UnsupportedEncodingException {
return writer;
}
@Override
public void flushBuffer() throws IOException {
if (out != null) {
out.flush();
}
if (writer != null) {
writer.flush();
}
}
@Override
public void reset() {
buffer.reset();
}
public byte[] getResponseData() throws IOException {
flushBuffer();
return buffer.toByteArray();
}
public String getContent() throws IOException {
flushBuffer();
return buffer.toString();
}
private class WapperedOutputStream extends ServletOutputStream {
private ByteArrayOutputStream bos = null;
public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
bos = stream;
}
@Override
public void write(int b) throws IOException {
bos.write(b);
}
@Override
public void write(byte[] b) throws IOException {
bos.write(b, 0, b.length);
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
bos.write(b, off, len);
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setWriteListener(WriteListener writeListener) {
}
}
}
2、創(chuàng)建過濾器
修改response中的內容,返回

package com.example.demo.filter;
import com.example.demo.wrapper.ResponseWrapper;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
@Component
public class ResponseFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
ResponseWrapper responseWrapper = new ResponseWrapper((HttpServletResponse) servletResponse);
filterChain.doFilter(servletRequest, responseWrapper);
String contentType = responseWrapper.getContentType();
byte[] content = responseWrapper.getResponseData();
String str="";
if (StringUtils.isNotBlank(contentType) && (contentType.contains(MediaType.APPLICATION_JSON_VALUE) || contentType.contains(MediaType.TEXT_HTML_VALUE))) {
str = new String(content);
str=str+"xiaoming";
System.out.println("filter:"+str);
HttpServletResponse response=(HttpServletResponse)servletResponse;
writeResponse(response,200,str);
}
}
public static void writeResponse(HttpServletResponse response, int status, String json) {
try {
response.reset();//很重要
response.setHeader("Access-Control-Allow-Origin", "*");
response.setHeader("Access-Control-Allow-Methods", "*");
response.setContentType("application/json;charset=UTF-8");
response.setStatus(status);
response.getWriter().write(json);
} catch (IOException e) {
e.printStackTrace();
}
}
}3、配置過濾器

package com.example.demo.config;
import com.example.demo.filter.ResponseFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import java.util.ArrayList;
import java.util.List;
@SpringBootConfiguration
public class FilterConfig {
@Autowired
private ResponseFilter responseFilter;
@Bean
public FilterRegistrationBean getFilterConfig(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(responseFilter);
List<String> filterList=new ArrayList<>();
filterList.add("/*");
filterRegistrationBean.setUrlPatterns(filterList);
return filterRegistrationBean;
}
}總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
javax.validation包里@NotNull等注解的使用方式
這篇文章主要介紹了javax.validation包里@NotNull等注解的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
springboot Quartz動態(tài)修改cron表達式的方法
這篇文章主要介紹了springboot Quartz動態(tài)修改cron表達式的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
如何在 Spring Boot 中配置和使用 CSRF 保護
CSRF是一種網(wǎng)絡攻擊,它利用已認證用戶的身份來執(zhí)行未經(jīng)用戶同意的操作,Spring Boot 提供了內置的 CSRF 保護機制,可以幫助您防止這種類型的攻擊,這篇文章主要介紹了Spring?Boot?中的?CSRF?保護配置的使用方法,需要的朋友可以參考下2023-09-09
Spring之ShutDown?Hook死鎖現(xiàn)象解讀
這篇文章主要介紹了Spring之ShutDown?Hook死鎖現(xiàn)象解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04
基于SqlSessionFactory的openSession方法使用
這篇文章主要介紹了SqlSessionFactory的openSession方法使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Spring Boot利用JSR303實現(xiàn)參數(shù)驗證的方法實例
這篇文章主要給大家介紹了關于Spring Boot利用JSR303實現(xiàn)參數(shù)驗證的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring Boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2020-05-05

