[JAVA] Holen Sie sich den Body-Teil von HttpResponse mit Spring Filter

Ich konnte keine schöne Legende finden, also habe ich eine gemacht. Es wurde bestätigt, dass es unter der STS-Debug-Umgebung funktioniert.

LoggingFilter.java


@Component
public class LoggingFilter implements Filter {
	private static final Logger log = LoggerFactory.getLogger(LoggingFilter.class.getName());

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {

		HttpServletResponseWrapperEx httpResponseEx = new HttpServletResponseWrapperEx(httpResponse);	
		chain.doFilter(request, httpResponseEx);

		String responseBody = httpResponseEx.getBody();		
		log.debug(responseBody);
	}
}

HttpServletResponseWrapperEx.java



public class HttpServletResponseWrapperEx extends HttpServletResponseWrapper {
	private ServletResponse response;
	private PrintWriterEx writerEx;
	private ServletOutputStreamEx outputStreamEx;
	
	public HttpServletResponseWrapperEx(HttpServletResponse response) {
		super(response);
		this.response = response;
	}
	
	@Override
	public ServletOutputStream getOutputStream() throws IOException {

		ServletOutputStream stream = this.response.getOutputStream();
		
		if (null == this.outputStreamEx) {
			this.outputStreamEx = new ServletOutputStreamEx(stream);
		}
		
		return this.outputStreamEx;
	}
	
	@Override
	public PrintWriter getWriter() throws IOException {
		PrintWriter writer = this.response.getWriter();
		this.writerEx = new PrintWriterEx(writer);
		return this.writerEx;
	}
	
	public String getBody() {
		String result = "";
		
		if (null != this.outputStreamEx) {
			result = this.outputStreamEx.getBody();
		}
		else if (null != this.writerEx) {
			result = this.writerEx.getBody();
		}
		
		return result;
	}
}

ServletOutputStreamEx.java



public class ServletOutputStreamEx extends ServletOutputStream {
	private StringBuilder body = new StringBuilder();
	private ServletOutputStream target;
	
	public ServletOutputStreamEx(ServletOutputStream target) {
		this.target = target;
	}

	@Override
	public boolean isReady() {
		return this.target.isReady();
	}

	@Override
	public void setWriteListener(WriteListener listener) {
		this.target.setWriteListener(listener);		
	}

	@Override
	public void write(int b) throws IOException {
		this.target.write(b);
		byte [] value = new byte[] {(byte)b};
		String temp = new String(value);
		body.append(temp);		
	}
	
	public String getBody() {
		return this.body.toString();
	}
}

PrintWriterEx.java


public class PrintWriterEx extends PrintWriter {

	private StringBuilder body = new StringBuilder();
	
	public PrintWriterEx(Writer out) {
		super(out);
	}
	
	@Override
	public void write(int c) {
		super.write(c);
		this.body.append((char)c);
	}
	
	@Override
	public void write(char[] chars, int offset, int length) {
		super.write(chars, offset, length);
		this.body.append(chars, offset, length);
	}
	
	public void write(String string, int offset, int length) {
		super.write(string, offset, length);
		this.body.append(string, offset, length);
	}
	
	public String getBody() {
		return this.body.toString();
	}
}

Machen Sie eine geeignete Probe und überprüfen Sie den Betrieb. Im folgenden Beispiel hat PrintWriterEx funktioniert.

HelloController.java


@Controller
public class HeloController{
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(Model model) {
        model.addAttribute("message", "Hello Springboot");
        return "index";
    }
}

Im folgenden Beispiel funktionierte ServletOutputStreamEx in beiden Fällen von GET / POST.

GoodbyeController.java


@RestController
public class GoodbyeController {

	@RequestMapping(path = "/goodbye", method = RequestMethod.GET)
	public String goodbye() {
		return "good bye";
	}
	
	@RequestMapping(path = "/goodbyebye", method = RequestMethod.POST)
	public String goodbyebye() {
		return "{ message: \"goodbye\" }";
	}
}

Recommended Posts

Holen Sie sich den Body-Teil von HttpResponse mit Spring Filter
Beginnen Sie mit Spring Boot
Erhalten Sie Validierungsergebnisse mit Spring Boot
Filtern Sie das Ergebnis von BindingResult [Spring]
Erhalten Sie Flux-Ergebnisse von Spring Web Flux von JS mit der Fetch-API
So lesen Sie Request Body mit Spring Boot + Spring Security mehrmals
Kollektive Behandlung von Spring-Validierungsfehlern mit @ControllerAdvice
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 2
Kompatibilität von Spring JDBC und My Batis mit Spring Data JDBC (vorläufig)
Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu
[Spring Boot] Benutzerinformationen mit Rest API abrufen (Anfänger)
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
Ich habe versucht, mit Spring Data JPA zu beginnen
Bis zur Verwendung von Spring Data und JPA Part 2
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 2).
Erstellen Sie Restapi mit Spring Boot (bis zum Ausführen der App)
Bis zur Verwendung von Spring Data und JPA Part 1
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Booten nach Umgebung mit Spring Boot of Maven
Passen Sie die Antwort auf REST-API-Fehler mit Spring Boot an (Teil 1).
Steuern Sie den Spring Batch-Verarbeitungsablauf mit JavaConfig.
Ersetzen Sie nur einen Teil des URL-Hosts durch Java
Erstellen Sie ein WEB-System mit Spring + Doma + H2DB Part 2
Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können