MyResponseWrapper.java 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package jnpf.wrapper;
  2. import jnpf.constant.GlobalConst;
  3. import jnpf.handler.IRestHandler;
  4. import jnpf.util.StringUtil;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.util.StringUtils;
  7. import jakarta.servlet.ServletOutputStream;
  8. import jakarta.servlet.WriteListener;
  9. import jakarta.servlet.http.HttpServletResponse;
  10. import jakarta.servlet.http.HttpServletResponseWrapper;
  11. import java.io.*;
  12. import java.nio.charset.StandardCharsets;
  13. import java.util.Collections;
  14. import java.util.List;
  15. import java.util.stream.Collectors;
  16. /**
  17. * Response封装
  18. * 处理类型:
  19. * application/json
  20. */
  21. public class MyResponseWrapper extends HttpServletResponseWrapper {
  22. private ByteArrayOutputStream buffer;
  23. private ServletOutputStream out = null;
  24. private PrintWriter writer = null;
  25. private List<IRestHandler> handlers;
  26. private boolean supportResponse;
  27. public MyResponseWrapper(HttpServletResponse resp, List<IRestHandler> handlers) throws IOException {
  28. super(resp);
  29. this.handlers = handlers.stream().filter(IRestHandler::supportResponse).collect(Collectors.toList());
  30. supportResponse = !this.handlers.isEmpty();
  31. //返回处理器顺序翻转
  32. Collections.reverse(this.handlers);
  33. if(supportResponse) {
  34. buffer = new ByteArrayOutputStream();
  35. }
  36. }
  37. @Override
  38. public ServletOutputStream getOutputStream() throws IOException {
  39. if(supportResponse) {
  40. if (out == null) {
  41. out = new WapperedOutputStream(buffer);
  42. }
  43. return out;
  44. }else{
  45. return super.getOutputStream();
  46. }
  47. }
  48. @Override
  49. public PrintWriter getWriter() throws IOException {
  50. if(supportResponse) {
  51. if (writer == null) {
  52. writer = new PrintWriter(new OutputStreamWriter(buffer, this.getCharacterEncoding()));
  53. }
  54. return writer;
  55. }else{
  56. return super.getWriter();
  57. }
  58. }
  59. @Override
  60. public void flushBuffer() throws IOException {
  61. if(supportResponse) {
  62. if (out != null) {
  63. out.flush();
  64. }
  65. if (writer != null) {
  66. writer.flush();
  67. }
  68. }else{
  69. super.flushBuffer();
  70. }
  71. }
  72. @Override
  73. public void reset() {
  74. if(supportResponse) {
  75. buffer.reset();
  76. }else{
  77. super.reset();
  78. }
  79. }
  80. public void doFinal() throws IOException{
  81. if(supportResponse) {
  82. flushBuffer();
  83. if (buffer.size() > 0) {
  84. byte[] byteArray = buffer.toByteArray();
  85. if (supportResponse && isJsonBodyRequest()) {
  86. getResponse().setContentLength(-1);
  87. getResponse().setCharacterEncoding(GlobalConst.DEFAULT_CHARSET_STR);
  88. String data = new String(byteArray, GlobalConst.DEFAULT_CHARSET);
  89. for (IRestHandler handler : handlers) {
  90. data = handler.processResponse(data);
  91. }
  92. writeResponse(data);
  93. return;
  94. }
  95. writeResponse(byteArray);
  96. }
  97. }
  98. }
  99. private void writeResponse(String responseString)
  100. throws IOException {
  101. PrintWriter out = getResponse().getWriter();
  102. out.write(responseString);
  103. out.flush();
  104. out.close();
  105. }
  106. private void writeResponse(byte[] responseData) throws IOException {
  107. ServletOutputStream outputStream = getResponse().getOutputStream();
  108. outputStream.write(responseData);
  109. outputStream.flush();
  110. outputStream.close();
  111. }
  112. private class WapperedOutputStream extends ServletOutputStream {
  113. private ByteArrayOutputStream bos = null;
  114. public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
  115. bos = stream;
  116. }
  117. @Override
  118. public void write(int b) throws IOException {
  119. bos.write(b);
  120. }
  121. @Override
  122. public boolean isReady() {
  123. return false;
  124. }
  125. @Override
  126. public void setWriteListener(WriteListener listener) {
  127. }
  128. }
  129. protected boolean isJsonBodyRequest(){
  130. String contentType = getResponse().getContentType();
  131. if(StringUtil.isNotEmpty(contentType)) {
  132. if (StringUtils.substringMatch(contentType, 0, MediaType.APPLICATION_JSON_VALUE)) {
  133. return true;
  134. }
  135. }
  136. return false;
  137. }
  138. }