金币系统后端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
3.1 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. }
  23. /**
  24. * 获取请求Body
  25. *
  26. * @param request request
  27. * @return String
  28. */
  29. public String getBodyString(final ServletRequest request) {
  30. try {
  31. return inputStream2String(request.getInputStream());
  32. } catch (IOException e) {
  33. log.error("", e);
  34. throw new RuntimeException(e);
  35. }
  36. }
  37. /**
  38. * 获取请求Body
  39. *
  40. * @return String
  41. */
  42. public String getBodyString() {
  43. final InputStream inputStream = new ByteArrayInputStream(body);
  44. return inputStream2String(inputStream);
  45. }
  46. /**
  47. * 将inputStream里的数据读取出来并转换成字符串
  48. *
  49. * @param inputStream inputStream
  50. * @return String
  51. */
  52. private String inputStream2String(InputStream inputStream) {
  53. StringBuilder sb = new StringBuilder();
  54. BufferedReader reader = null;
  55. try {
  56. reader = new BufferedReader(new InputStreamReader(inputStream, Charset.defaultCharset()));
  57. String line;
  58. while ((line = reader.readLine()) != null) {
  59. sb.append(line);
  60. }
  61. } catch (IOException e) {
  62. log.error("", e);
  63. throw new RuntimeException(e);
  64. } finally {
  65. if (reader != null) {
  66. try {
  67. reader.close();
  68. } catch (IOException e) {
  69. log.error("", e);
  70. }
  71. }
  72. }
  73. return sb.toString();
  74. }
  75. @Override
  76. public BufferedReader getReader() throws IOException {
  77. return new BufferedReader(new InputStreamReader(getInputStream()));
  78. }
  79. @Override
  80. public ServletInputStream getInputStream() throws IOException {
  81. final ByteArrayInputStream inputStream = new ByteArrayInputStream(body);
  82. return new ServletInputStream() {
  83. @Override
  84. public int read() throws IOException {
  85. return inputStream.read();
  86. }
  87. @Override
  88. public boolean isFinished() {
  89. return false;
  90. }
  91. @Override
  92. public boolean isReady() {
  93. return false;
  94. }
  95. @Override
  96. public void setReadListener(ReadListener readListener) {
  97. }
  98. };
  99. }
  100. }