| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- package jnpf.wrapper;
- import jnpf.constant.GlobalConst;
- import jnpf.handler.IRestHandler;
- import jnpf.util.StringUtil;
- import org.springframework.http.MediaType;
- import org.springframework.util.StringUtils;
- import jakarta.servlet.ServletOutputStream;
- import jakarta.servlet.WriteListener;
- import jakarta.servlet.http.HttpServletResponse;
- import jakarta.servlet.http.HttpServletResponseWrapper;
- import java.io.*;
- import java.nio.charset.StandardCharsets;
- import java.util.Collections;
- import java.util.List;
- import java.util.stream.Collectors;
- /**
- * Response封装
- * 处理类型:
- * application/json
- */
- public class MyResponseWrapper extends HttpServletResponseWrapper {
- private ByteArrayOutputStream buffer;
- private ServletOutputStream out = null;
- private PrintWriter writer = null;
- private List<IRestHandler> handlers;
- private boolean supportResponse;
- public MyResponseWrapper(HttpServletResponse resp, List<IRestHandler> handlers) throws IOException {
- super(resp);
- this.handlers = handlers.stream().filter(IRestHandler::supportResponse).collect(Collectors.toList());
- supportResponse = !this.handlers.isEmpty();
- //返回处理器顺序翻转
- Collections.reverse(this.handlers);
- if(supportResponse) {
- buffer = new ByteArrayOutputStream();
- }
- }
- @Override
- public ServletOutputStream getOutputStream() throws IOException {
- if(supportResponse) {
- if (out == null) {
- out = new WapperedOutputStream(buffer);
- }
- return out;
- }else{
- return super.getOutputStream();
- }
- }
- @Override
- public PrintWriter getWriter() throws IOException {
- if(supportResponse) {
- if (writer == null) {
- writer = new PrintWriter(new OutputStreamWriter(buffer, this.getCharacterEncoding()));
- }
- return writer;
- }else{
- return super.getWriter();
- }
- }
- @Override
- public void flushBuffer() throws IOException {
- if(supportResponse) {
- if (out != null) {
- out.flush();
- }
- if (writer != null) {
- writer.flush();
- }
- }else{
- super.flushBuffer();
- }
- }
- @Override
- public void reset() {
- if(supportResponse) {
- buffer.reset();
- }else{
- super.reset();
- }
- }
- public void doFinal() throws IOException{
- if(supportResponse) {
- flushBuffer();
- if (buffer.size() > 0) {
- byte[] byteArray = buffer.toByteArray();
- if (supportResponse && isJsonBodyRequest()) {
- getResponse().setContentLength(-1);
- getResponse().setCharacterEncoding(GlobalConst.DEFAULT_CHARSET_STR);
- String data = new String(byteArray, GlobalConst.DEFAULT_CHARSET);
- for (IRestHandler handler : handlers) {
- data = handler.processResponse(data);
- }
- writeResponse(data);
- return;
- }
- writeResponse(byteArray);
- }
- }
- }
- private void writeResponse(String responseString)
- throws IOException {
- PrintWriter out = getResponse().getWriter();
- out.write(responseString);
- out.flush();
- out.close();
- }
- private void writeResponse(byte[] responseData) throws IOException {
- ServletOutputStream outputStream = getResponse().getOutputStream();
- outputStream.write(responseData);
- outputStream.flush();
- outputStream.close();
- }
- private class WapperedOutputStream extends ServletOutputStream {
- private ByteArrayOutputStream bos = null;
- public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException {
- bos = stream;
- }
- @Override
- public void write(int b) throws IOException {
- bos.write(b);
- }
- @Override
- public boolean isReady() {
- return false;
- }
- @Override
- public void setWriteListener(WriteListener listener) {
- }
- }
- protected boolean isJsonBodyRequest(){
- String contentType = getResponse().getContentType();
- if(StringUtil.isNotEmpty(contentType)) {
- if (StringUtils.substringMatch(contentType, 0, MediaType.APPLICATION_JSON_VALUE)) {
- return true;
- }
- }
- return false;
- }
- }
|