6a40a4bec956e82bc3005c4940bf1733b06a4883.svn-base 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package org.jeecg.config.sign.util;
  2. import javax.servlet.ReadListener;
  3. import javax.servlet.ServletInputStream;
  4. import javax.servlet.ServletRequest;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletRequestWrapper;
  7. import java.io.*;
  8. import java.nio.charset.Charset;
  9. /**
  10. * 保存过滤器里面的流
  11. *
  12. * @author jeecg
  13. * @date 20210621
  14. */
  15. public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
  16. private final byte[] body;
  17. public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {
  18. super(request);
  19. String sessionStream = getBodyString(request);
  20. body = sessionStream.getBytes(Charset.forName("UTF-8"));
  21. }
  22. /**
  23. * 获取请求Body
  24. *
  25. * @param request
  26. * @return
  27. */
  28. public String getBodyString(final ServletRequest request) {
  29. StringBuilder sb = new StringBuilder();
  30. try (InputStream inputStream = cloneInputStream(request.getInputStream());
  31. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, Charset.forName("UTF-8")))) {
  32. String line;
  33. while ((line = reader.readLine()) != null) {
  34. sb.append(line);
  35. }
  36. } catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. return sb.toString();
  40. }
  41. /**
  42. * Description: 复制输入流</br>
  43. *
  44. * @param inputStream
  45. * @return</br>
  46. */
  47. public InputStream cloneInputStream(ServletInputStream inputStream) {
  48. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  49. byte[] buffer = new byte[1024];
  50. int len;
  51. try {
  52. while ((len = inputStream.read(buffer)) > -1) {
  53. byteArrayOutputStream.write(buffer, 0, len);
  54. }
  55. byteArrayOutputStream.flush();
  56. } catch (IOException e) {
  57. e.printStackTrace();
  58. }
  59. return new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
  60. }
  61. @Override
  62. public BufferedReader getReader() {
  63. return new BufferedReader(new InputStreamReader(getInputStream()));
  64. }
  65. @Override
  66. public ServletInputStream getInputStream() {
  67. final ByteArrayInputStream bais = new ByteArrayInputStream(body);
  68. return new ServletInputStream() {
  69. @Override
  70. public int read() {
  71. return bais.read();
  72. }
  73. @Override
  74. public boolean isFinished() {
  75. return false;
  76. }
  77. @Override
  78. public boolean isReady() {
  79. return false;
  80. }
  81. @Override
  82. public void setReadListener(ReadListener readListener) {
  83. }
  84. };
  85. }
  86. }