这里用这种包,其实在一些情况下,没有必要,如果要对response返回的数据进行重写的话,是没有问题的

    1. import lombok.extern.slf4j.Slf4j;
    2. import org.springframework.util.StreamUtils;
    3. import javax.servlet.ReadListener;
    4. import javax.servlet.ServletInputStream;
    5. import javax.servlet.http.HttpServletRequest;
    6. import javax.servlet.http.HttpServletRequestWrapper;
    7. import java.io.BufferedReader;
    8. import java.io.ByteArrayInputStream;
    9. import java.io.IOException;
    10. import java.io.InputStreamReader;
    11. /**
    12. * @author shizi
    13. * @since 2020-12-21 18:24:33
    14. */
    15. @Slf4j
    16. public class HttpRequestWrapper extends HttpServletRequestWrapper {
    17. private byte[] body;
    18. /**
    19. * Constructs a request object wrapping the given request.
    20. *
    21. * @param request The request to wrap
    22. * @throws IllegalArgumentException if the request is null
    23. */
    24. public HttpRequestWrapper(HttpServletRequest request) {
    25. super(request);
    26. try {
    27. body = StreamUtils.copyToByteArray(request.getInputStream());
    28. } catch (IOException e) {
    29. log.error("wrapper request io fail:{}", request.getRequestURI(), e);
    30. }
    31. }
    32. @Override
    33. public ServletInputStream getInputStream() {
    34. return new SignWrapperInputStream(body);
    35. }
    36. @Override
    37. public BufferedReader getReader() {
    38. return new BufferedReader(new InputStreamReader(getInputStream()));
    39. }
    40. public byte[] getBody() {
    41. return body;
    42. }
    43. public void setBody(byte[] body) {
    44. this.body = body;
    45. }
    46. private static class SignWrapperInputStream extends ServletInputStream {
    47. private ByteArrayInputStream buffer;
    48. SignWrapperInputStream(byte[] body) {
    49. body = (body == null) ? new byte[0] : body;
    50. this.buffer = new ByteArrayInputStream(body);
    51. }
    52. @Override
    53. public int read() {
    54. return buffer.read();
    55. }
    56. @Override
    57. public boolean isFinished() {
    58. return buffer.available() == 0;
    59. }
    60. @Override
    61. public boolean isReady() {
    62. return true;
    63. }
    64. @Override
    65. public void setReadListener(ReadListener listener) {
    66. throw new RuntimeException("Not implemented");
    67. }
    68. }
    69. }
    1. @Slf4j
    2. public class HttpResponseWrapper extends HttpServletResponseWrapper {
    3. private final WrapperServletOutputStream wrapperServletOutputStream = new WrapperServletOutputStream();
    4. HttpResponseWrapper(HttpServletResponse response) {
    5. super(response);
    6. }
    7. @Override
    8. public ServletOutputStream getOutputStream() {
    9. return wrapperServletOutputStream;
    10. }
    11. @Override
    12. public PrintWriter getWriter() {
    13. return new PrintWriter(wrapperServletOutputStream);
    14. }
    15. public byte[] getBodyBytes() {
    16. return wrapperServletOutputStream.out.toByteArray();
    17. }
    18. public String getBodyString() {
    19. try {
    20. return wrapperServletOutputStream.out.toString("UTF-8");
    21. } catch (UnsupportedEncodingException e) {
    22. return "[UNSUPPORTED ENCODING]";
    23. }
    24. }
    25. public void setBody(String body) throws IOException {
    26. wrapperServletOutputStream.out.write(body.getBytes(StandardCharsets.UTF_8));
    27. }
    28. /**
    29. * 将 body内容 重新赋值到 response 中
    30. * 由于stream 只读一次 需要重写到response中
    31. */
    32. public void copyToResponse() {
    33. try {
    34. getResponse().getOutputStream().write(getBodyBytes());
    35. } catch (IOException e) {
    36. log.error("copy to response fail", e);
    37. }
    38. }
    39. private static class WrapperServletOutputStream extends ServletOutputStream {
    40. private ByteArrayOutputStream out = new ByteArrayOutputStream();
    41. @Override
    42. public boolean isReady() {
    43. return true;
    44. }
    45. @Override
    46. public void setWriteListener(WriteListener writeListener) {
    47. }
    48. @Override
    49. public void write(int b) {
    50. out.write(b);
    51. }
    52. @Override
    53. public void write(byte[] b) throws IOException {
    54. out.write(b);
    55. }
    56. @Override
    57. public void write(byte[] b, int off, int len) {
    58. out.write(b, off, len);
    59. }
    60. }
    61. }