[JAVA] So lesen Sie Request Body mit Spring Boot + Spring Security mehrmals

Einführung

Im Spring Security-Autorisierungsprozess (Abstimmungsklasse usw.) Ich denke, es gibt Fälle, in denen Sie sich auf den Text der Anfrage beziehen müssen. (Zum Beispiel beim Aktualisieren der Datenbank mit POST oder PUT usw.

In der HttpServletRequest-Klasse jedoch Der Körper ist ein Strom und kann nur einmal gelesen werden.

Dieses Mal werde ich vorstellen, wie man Body mehrmals liest.

Was du machen willst

① Halten Sie die von Body gelesenen Informationen (2) Ersetzen Sie die Körpererfassungsquelle durch die Informationen in (1).

Vorbereitung der Ersatzklasse

Stream-Klasse Wird beim Aufrufen von HttpServletRequest.getInputStream () als Rückgabetyp festgelegt. Verwenden Sie das Byte-Array zur Initialisierung

BufferedServletInputStream.java


public class BufferedServletInputStream extends ServletInputStream {

	private ByteArrayInputStream inputStream;

	//Mit Byte-Array initialisieren
	public BufferedServletInputStream(byte[] buffer) {
		this.inputStream = new ByteArrayInputStream(buffer);
	}

	@Override
	public int available() throws IOException {
		return inputStream.available();
	}

	@Override
	public int read() throws IOException {
		return inputStream.read();
	}

	@Override
	public int read(byte[] b, int off, int len) throws IOException {
		return inputStream.read(b, off, len);
	}

	@Override
	public boolean isFinished() {
		return false;
	}

	@Override
	public boolean isReady() {
		return false;
	}

	@Override
	public void setReadListener(ReadListener listener) {

	}
}

Wrapper-Klasse für HttpServletRequest

BufferedServletRequestWrapper.java


public class BufferedServletRequestWrapper extends HttpServletRequestWrapper {

	private byte[] buffer;

	public BufferedServletRequestWrapper(HttpServletRequest request) throws IOException {
		super(request);

		//Holen Sie sich Stream von Request Body
		InputStream is = request.getInputStream();

		//Konvertieren Sie Stream in ein Byte-Array und behalten Sie es in der Instanzvariablen bei
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		byte buff[] = new byte[1024];
		int read;
		while ((read = is.read(buff)) > 0) {
			baos.write(buff, 0, read);
		}

		this.buffer = baos.toByteArray();
	}

	//Ersetzen Sie die Körpererfassungsquelle durch diese Methode
	@Override
	public ServletInputStream getInputStream() throws IOException {
		//Stream-Klasse initialisieren und zurückgeben
		return new BufferedServletInputStream(this.buffer);
	}
}

Eigentlich ersetzen

Filterklasse Auf Anfrage durch OncePerRequestFilter ersetzen

MultipleReadEnableFilter.java


@Component
public class MultipleReadEnableFilter extends OncePerRequestFilter {

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

		//Initialisieren Sie die Wrapper-Klasse von HttpServletRequest
		HttpServletRequest wrappedRequest = new BufferedServletRequestWrapper((HttpServletRequest) request);
		filterChain.doFilter(wrappedRequest, response);
	}
}

Legen Sie den erstellten Filter in der Einstellungsklasse Spring Security fest

//Wrap, um inputStream mehrmals zu lesen
http.addFilter(multipleReadEnableFilter);

Referenz

Yamaoku Tsushin Sonderausgabe

Recommended Posts

So lesen Sie Request Body mit Spring Boot + Spring Security mehrmals
Lassen Sie uns herausfinden, wie Sie mit Request Body mit der REST-API von Spring Boot empfangen können
Booten nach Umgebung mit Spring Boot of Maven
[Spring Boot] Ich habe untersucht, wie die Nachbearbeitung der empfangenen Anforderung implementiert werden kann.
Verwendung von MyBatis2 (iBatis) mit Spring Boot 1.4 (Spring 4)
Verwendung des eingebauten h2db mit Federstiefel
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Verwendung von CommandLineRunner im Spring Batch von Spring Boot
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
So stellen Sie Spring Boot + PostgreSQL ein
Verwendung derselben Mapper-Klasse in mehreren Datenquellen mit Spring Boot + MyBatis
Verwendung von ModelMapper (Spring Boot)
So erstellen Sie mit Spring Boot einen eigenen Controller, der / error entspricht
So erzielen Sie mit Rest Template of Spring einen großen Datei-Upload
Wie Spring Security mit Hello World funktioniert
So teilen Sie eine Spring Boot-Nachrichtendatei
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
So greifen Sie mit der TCP-Funktion von Spring Integration direkt auf Socket zu
Wie Bean-Eigenschaften Anforderungsparameter im Listenstil in Spring binden
Hash-Passwörter mit Spring Boot + Spring Security (mit Salt, mit Stretching)
So speichern Sie mit einer Eingabe in mehreren Tabellen
So verkleinern Sie das Spring Boot Docker-Image
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Versuchen Sie die LDAP-Authentifizierung mit Spring Security (Spring Boot) + OpenLDAP
Versuchen Sie, die Anmeldefunktion mit Spring Boot zu implementieren
So erstellen Sie mit ActiveHash mehrere Pulldown-Menüs
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So führen Sie UT mit Excel als Testdaten mit Spring Boot + JUnit5 + DBUnit durch
Holen Sie sich den Body-Teil von HttpResponse mit Spring Filter
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Versuchen Sie, die Migration mit Spring Boot Flyway zu automatisieren
[Java] Artikel zum Hinzufügen einer Validierung mit Spring Boot 2.3.1.
Ich wollte Spring Boot in einem Multiprojekt gradle
Ich habe versucht, eine Webanwendung voller Fehler mit Spring Boot zu klonen
So legen Sie Umgebungsvariablen in der Eigenschaftendatei der Spring-Boot-Anwendung fest
So definieren Sie mehrere orm.xml in Spring4, JPA2.1
Teil 2 Teil II. So fahren Sie mit den ersten Schritten fort Spring Referenzhandbuch Note Hinweis ①
[Spring Boot] So verweisen Sie auf die Eigenschaftendatei
Spring Boot - So stellen Sie das Sitzungszeitlimit ein
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Anfordern durch Übergeben eines Arrays an eine Abfrage mit dem HTTP-Client von Ruby
Eine kurze Hand, die einen JSON-Body aus ServerHttpRequest mit einem selbst erstellten WebFilter usw. mit Spring WebFlux liest
Einstellungen für die Verbindung zu MySQL mit Spring Boot + Spring JDBC
So stellen Sie Spring Boot Dependency Injection (DI) ein
So wenden Sie HandlerInterceptor auf das http-Inbound-Gateway von Spring Integration an
So schreiben Sie einen Komponententest für Spring Boot 2
Ordnen Sie DTO automatisch Entitäten mit der Spring Boot-API zu
[Java] So lassen Sie die Federkonstruktorinjektion mit Lombok weg
Ein Memorandum über die Sucht nach Spring Boot2 x Doma2
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
Umgang mit Keine Vorlage für interaktive Anfragen
Greifen Sie mit jdbcTemplate auf das integrierte h2db des Spring Boot zu
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
So erstellen Sie ein Spring Boot-Projekt in IntelliJ
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
[Spring Boot] So erstellen Sie ein Projekt (für Anfänger)