122 lines
3.2 KiB

  1. package com.example.demo.Util;
  2. import jakarta.servlet.ReadListener;
  3. import jakarta.servlet.ServletInputStream;
  4. import jakarta.servlet.ServletRequest;
  5. import jakarta.servlet.http.HttpServletRequest;
  6. import jakarta.servlet.http.HttpServletRequestWrapper;
  7. import lombok.extern.slf4j.Slf4j;
  8. import java.io.*;
  9. import java.nio.charset.Charset;
  10. //包装HttpServletRequest,目的是让其输入流可重复读
  11. @Slf4j
  12. public class RequestWrapper extends HttpServletRequestWrapper {
  13. /**
  14. * 存储body数据的容器
  15. */
  16. private final byte[] body;
  17. public RequestWrapper(HttpServletRequest request) throws IOException {
  18. super(request);
  19. // 将body数据存储起来
  20. String bodyStr = getBodyString(request);
  21. body = bodyStr.getBytes(Charset.defaultCharset());
  22. System.out.println(new String(body, Charset.defaultCharset()) + "+**+*+*+*++*+*+*+");
  23. }
  24. /**
  25. * 获取请求Body
  26. *
  27. * @param request request
  28. * @return String
  29. */
  30. public String getBodyString(final ServletRequest request) {
  31. try {
  32. return inputStream2String(request.getInputStream());
  33. } catch (IOException e) {
  34. log.error("", e);
  35. throw new RuntimeException(e);
  36. }
  37. }
  38. /**
  39. * 获取请求Body
  40. *
  41. * @return String
  42. */
  43. public String getBodyString() {
  44. final InputStream inputStream = new ByteArrayInputStream(body);
  45. return inputStream2String(inputStream);
  46. }
  47. /**
  48. * 将inputStream里的数据读取出来并转换成字符串
  49. *
  50. * @param inputStream inputStream
  51. * @return String
  52. */
  53. private String inputStream2String(InputStream inputStream) {
  54. StringBuilder sb = new StringBuilder();
  55. BufferedReader reader = null;
  56. try {
  57. reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset()));
  58. String line;
  59. while ((line = reader.readLine()) != null) {
  60. sb.append(line);
  61. }
  62. } catch (IOException e) {
  63. log.error("", e);
  64. throw new RuntimeException(e);
  65. } finally {
  66. if (reader != null) {
  67. try {
  68. reader.close();
  69. } catch (IOException e) {
  70. log.error("", e);
  71. }
  72. }
  73. }
  74. return sb.toString();
  75. }
  76. @Override
  77. public BufferedReader getReader() throws IOException {
  78. return new BufferedReader(new InputStreamReader(getInputStream()));
  79. }
  80. @Override
  81. public ServletInputStream getInputStream() throws IOException {
  82. final ByteArrayInputStream inputStream = new ByteArrayInputStream(body);
  83. return new ServletInputStream() {
  84. @Override
  85. public int read() throws IOException {
  86. return inputStream.read();
  87. }
  88. @Override
  89. public boolean isFinished() {
  90. return false;
  91. }
  92. @Override
  93. public boolean isReady() {
  94. return false;
  95. }
  96. @Override
  97. public void setReadListener(ReadListener readListener) {
  98. }
  99. };
  100. }
  101. }