java.lang.Object
jakarta.servlet.ServletResponseWrapper
jakarta.servlet.http.HttpServletResponseWrapper
org.miaixz.bus.spring.http.MutableResponseWrapper
- All Implemented Interfaces:
jakarta.servlet.http.HttpServletResponse,jakarta.servlet.ServletResponse
public class MutableResponseWrapper
extends jakarta.servlet.http.HttpServletResponseWrapper
可重复读取响应内容的包装器,支持缓存响应内容,便于日志记录和后续处理(不缓存SSE)。
该类继承自HttpServletResponseWrapper,主要功能包括:
- 缓存响应内容,使得响应内容可以被多次读取
- 自动识别并处理流式响应(如SSE),对流式响应不进行缓存
- 提供获取响应内容的方法,便于日志记录和后续处理
使用示例:
// 在过滤器中使用
public class ResponseCacheFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 包装响应
CacheResponseWrapper wrappedResponse = new CacheResponseWrapper((HttpServletResponse) response);
// 继续过滤器链
chain.doFilter(request, wrappedResponse);
// 获取响应内容
byte[] responseBody = wrappedResponse.getBody();
// 记录日志或进行其他处理
logResponse(responseBody);
}
}
- Since:
- Java 17+
- Author:
- Kimi Liu
-
Field Summary
Fields inherited from interface jakarta.servlet.http.HttpServletResponse
SC_ACCEPTED, SC_BAD_GATEWAY, SC_BAD_REQUEST, SC_CONFLICT, SC_CONTINUE, SC_CREATED, SC_EXPECTATION_FAILED, SC_FORBIDDEN, SC_FOUND, SC_GATEWAY_TIMEOUT, SC_GONE, SC_HTTP_VERSION_NOT_SUPPORTED, SC_INTERNAL_SERVER_ERROR, SC_LENGTH_REQUIRED, SC_METHOD_NOT_ALLOWED, SC_MISDIRECTED_REQUEST, SC_MOVED_PERMANENTLY, SC_MOVED_TEMPORARILY, SC_MULTIPLE_CHOICES, SC_NO_CONTENT, SC_NON_AUTHORITATIVE_INFORMATION, SC_NOT_ACCEPTABLE, SC_NOT_FOUND, SC_NOT_IMPLEMENTED, SC_NOT_MODIFIED, SC_OK, SC_PARTIAL_CONTENT, SC_PAYMENT_REQUIRED, SC_PERMANENT_REDIRECT, SC_PRECONDITION_FAILED, SC_PROXY_AUTHENTICATION_REQUIRED, SC_REQUEST_ENTITY_TOO_LARGE, SC_REQUEST_TIMEOUT, SC_REQUEST_URI_TOO_LONG, SC_REQUESTED_RANGE_NOT_SATISFIABLE, SC_RESET_CONTENT, SC_SEE_OTHER, SC_SERVICE_UNAVAILABLE, SC_SWITCHING_PROTOCOLS, SC_TEMPORARY_REDIRECT, SC_UNAUTHORIZED, SC_UNPROCESSABLE_CONTENT, SC_UNSUPPORTED_MEDIA_TYPE, SC_UPGRADE_REQUIRED, SC_USE_PROXY -
Constructor Summary
ConstructorsConstructorDescriptionMutableResponseWrapper(jakarta.servlet.http.HttpServletResponse response) 构造方法,初始化响应包装器。 -
Method Summary
Modifier and TypeMethodDescriptionbyte[]getBody()获取缓存的响应内容。jakarta.servlet.ServletOutputStream获取Servlet输出流,用于写入响应内容。获取打印写入器,用于写入响应内容。boolean判断是否为流式响应。voidsetContentType(String type) 设置响应的内容类型。void检查并设置是否为流式响应。Methods inherited from class jakarta.servlet.http.HttpServletResponseWrapper
addCookie, addDateHeader, addHeader, addIntHeader, containsHeader, encodeRedirectURL, encodeURL, getHeader, getHeaderNames, getHeaders, getStatus, getTrailerFields, sendError, sendError, sendRedirect, sendRedirect, sendRedirect, sendRedirect, setDateHeader, setHeader, setIntHeader, setStatus, setTrailerFieldsMethods inherited from class jakarta.servlet.ServletResponseWrapper
flushBuffer, getBufferSize, getCharacterEncoding, getContentType, getLocale, getResponse, isCommitted, isWrapperFor, isWrapperFor, reset, resetBuffer, setBufferSize, setCharacterEncoding, setCharacterEncoding, setContentLength, setContentLengthLong, setLocale, setResponseMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface jakarta.servlet.ServletResponse
flushBuffer, getBufferSize, getCharacterEncoding, getContentType, getLocale, isCommitted, reset, resetBuffer, setBufferSize, setCharacterEncoding, setCharacterEncoding, setContentLength, setContentLengthLong, setLocale
-
Constructor Details
-
MutableResponseWrapper
public MutableResponseWrapper(jakarta.servlet.http.HttpServletResponse response) 构造方法,初始化响应包装器。- Parameters:
response- 原始HTTP响应对象
-
-
Method Details
-
getWriter
获取打印写入器,用于写入响应内容。对于流式响应(如SSE),直接返回原始响应的打印写入器,不做额外处理; 对于非流式响应,返回一个包装后的打印写入器,可以同时写入原始响应和缓存。
- Specified by:
getWriterin interfacejakarta.servlet.ServletResponse- Overrides:
getWriterin classjakarta.servlet.ServletResponseWrapper- Returns:
- 打印写入器
- Throws:
IOException- 如果发生I/O错误
-
setContentType
设置响应的内容类型。该方法在设置内容类型的同时,会根据内容类型判断是否为流式响应(如SSE)。
- Specified by:
setContentTypein interfacejakarta.servlet.ServletResponse- Overrides:
setContentTypein classjakarta.servlet.ServletResponseWrapper- Parameters:
type- 内容类型
-
getOutputStream
获取Servlet输出流,用于写入响应内容。对于流式响应(如SSE),直接返回原始响应的输出流,不做额外处理; 对于非流式响应,返回一个包装后的输出流,可以同时写入原始响应和缓存。
- Specified by:
getOutputStreamin interfacejakarta.servlet.ServletResponse- Overrides:
getOutputStreamin classjakarta.servlet.ServletResponseWrapper- Returns:
- Servlet输出流
- Throws:
IOException- 如果发生I/O错误
-
getBody
public byte[] getBody()获取缓存的响应内容。- Returns:
- 响应内容的字节数组
-
streaming
public void streaming()检查并设置是否为流式响应。该方法会根据当前响应的内容类型判断是否为流式响应(如SSE), 并设置
isStreaming标志。 -
isStreaming
public boolean isStreaming()判断是否为流式响应。- Returns:
- 如果为流式响应则返回true,否则返回false
-