Module bus.starter

Class MutableResponseWrapper

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

    Constructors
    Constructor
    Description
    MutableResponseWrapper(jakarta.servlet.http.HttpServletResponse response)
    构造方法,初始化响应包装器。
  • Method Summary

    Modifier and Type
    Method
    Description
    byte[]
    获取缓存的响应内容。
    jakarta.servlet.ServletOutputStream
    获取Servlet输出流,用于写入响应内容。
    获取打印写入器,用于写入响应内容。
    boolean
    判断是否为流式响应。
    void
    设置响应的内容类型。
    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, setTrailerFields

    Methods inherited from class jakarta.servlet.ServletResponseWrapper

    flushBuffer, getBufferSize, getCharacterEncoding, getContentType, getLocale, getResponse, isCommitted, isWrapperFor, isWrapperFor, reset, resetBuffer, setBufferSize, setCharacterEncoding, setCharacterEncoding, setContentLength, setContentLengthLong, setLocale, setResponse

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

    Methods 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

      public PrintWriter getWriter() throws IOException
      获取打印写入器,用于写入响应内容。

      对于流式响应(如SSE),直接返回原始响应的打印写入器,不做额外处理; 对于非流式响应,返回一个包装后的打印写入器,可以同时写入原始响应和缓存。

      Specified by:
      getWriter in interface jakarta.servlet.ServletResponse
      Overrides:
      getWriter in class jakarta.servlet.ServletResponseWrapper
      Returns:
      打印写入器
      Throws:
      IOException - 如果发生I/O错误
    • setContentType

      public void setContentType(String type)
      设置响应的内容类型。

      该方法在设置内容类型的同时,会根据内容类型判断是否为流式响应(如SSE)。

      Specified by:
      setContentType in interface jakarta.servlet.ServletResponse
      Overrides:
      setContentType in class jakarta.servlet.ServletResponseWrapper
      Parameters:
      type - 内容类型
    • getOutputStream

      public jakarta.servlet.ServletOutputStream getOutputStream() throws IOException
      获取Servlet输出流,用于写入响应内容。

      对于流式响应(如SSE),直接返回原始响应的输出流,不做额外处理; 对于非流式响应,返回一个包装后的输出流,可以同时写入原始响应和缓存。

      Specified by:
      getOutputStream in interface jakarta.servlet.ServletResponse
      Overrides:
      getOutputStream in class jakarta.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