babaa2a6801df2fe4c80c6d87148e0443b931604.svn-base 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package cn.com.goldenwater.dcproj.filter;
  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.StandardCharsets;
  9. public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
  10. /**
  11. * Constructs a request object wrapping the given request.
  12. *
  13. * @param request
  14. * @throws IllegalArgumentException if the request is null
  15. */
  16. private final byte[] body;
  17. public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) {
  18. super(request);
  19. synchronized (this) {
  20. String sessionStream = getBodyString(request);
  21. body = sessionStream.getBytes(StandardCharsets.UTF_8);
  22. }
  23. }
  24. public String getBodyString(final ServletRequest request) {
  25. StringBuilder sb = new StringBuilder();
  26. InputStream inputStream = null;
  27. BufferedReader reader = null;
  28. try {
  29. inputStream = cloneInputStream(request.getInputStream());
  30. reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
  31. String line = "";
  32. while ((line = reader.readLine()) != null) {
  33. sb.append(line);
  34. }
  35. }
  36. catch (IOException e) {
  37. e.printStackTrace();
  38. }
  39. finally {
  40. if (inputStream != null) {
  41. try {
  42. inputStream.close();
  43. }
  44. catch (IOException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. if (reader != null) {
  49. try {
  50. reader.close();
  51. }
  52. catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56. }
  57. return sb.toString();
  58. }
  59. /**
  60. * Description: 复制输入流</br>
  61. *
  62. * @param inputStream
  63. * @return</br>
  64. */
  65. public InputStream cloneInputStream(ServletInputStream inputStream) {
  66. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  67. byte[] buffer = new byte[1024];
  68. int len;
  69. try {
  70. while ((len = inputStream.read(buffer)) > -1) {
  71. byteArrayOutputStream.write(buffer, 0, len);
  72. }
  73. byteArrayOutputStream.flush();
  74. }
  75. catch (IOException e) {
  76. e.printStackTrace();
  77. }
  78. InputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
  79. return byteArrayInputStream;
  80. }
  81. @Override
  82. public BufferedReader getReader() throws IOException {
  83. return new BufferedReader(new InputStreamReader(getInputStream()));
  84. }
  85. @Override
  86. public ServletInputStream getInputStream() throws IOException {
  87. final ByteArrayInputStream bais = new ByteArrayInputStream(body);
  88. return new ServletInputStream() {
  89. @Override
  90. public int read() throws IOException {
  91. return bais.read();
  92. }
  93. @Override
  94. public boolean isFinished() {
  95. return false;
  96. }
  97. @Override
  98. public boolean isReady() {
  99. return false;
  100. }
  101. @Override
  102. public void setReadListener(ReadListener readListener) {
  103. }
  104. };
  105. }
  106. }