[JAVA] Spring Boot (1 Serie) + spring-security-oauth2 + Redis Session + Heroku mit SerializationException

Eine SerializationException ist aufgetreten, wenn auf Heroku eine Kombination aus Spring Boot (1 Serie) + Spring-Security-Oauth2 + Redis Session ausgeführt wurde. (Dies geschieht nicht mit einer Instanz. Nur mit mehreren Instanzen.)

Ursache und Lösung

Wenn Sie die Spring Boot 2-Serie (Spring 5-Serie) verwenden, sollten Sie übrigens die Spring Security 5-Serie verwenden. (Nicht ausprobiert) Es ist besser, wenn es auf die Spring Boot 2-Serie (Spring 5-Serie) aktualisiert werden kann.

Das Problem scheint in spring-security-oauth2 zu liegen. Es gibt zwei Lösungen, die gegoogelt wurden

  1. Wenn eine SerializationException auftritt, löschen Sie den Redis-Schlüssel. (id: katsu68s Blog)
  2. Machen Sie eine Sticky-Sitzung (Heroku Sticky-Sitzungseinstellungen)

Wenn es nur 1 ist, ist es fast unmöglich, den Anmeldestatus beizubehalten, da SerializationException bei Heroku häufig auftritt. Bei nur 2 ist es wenig sinnvoll, mehrere Instanzen zu haben, und wenn der Neustart ausgeführt wird, tritt immer noch eine SerializationException auf.

Daher wurden beide Maßnahmen ergriffen. Die Sitzung läuft nur ab, wenn die Heroku-Instanz bereitgestellt und neu gestartet wird, aber ich habe mich entschlossen, eine Weile damit zu arbeiten.

Ich weiß jedoch nicht, wann Heroku neu gestartet wird (es kann bis zu einem gewissen Grad durch jederzeitiges Neustarten gesteuert werden). Häufige Abmeldungen sind für Benutzer stressig.

Eine Bibliothek gemacht

Um dies zu vermeiden, habe ich mich entschlossen, selbst etwas zu verarbeiten. Ich habe auch beschlossen, es als Bibliothek zu veröffentlichen. -> Erstellte Bibliothek

		<dependency>
			<groupId>jp.co.ap-com</groupId>
			<artifactId>spring-oauth2-serializable</artifactId>
			<version>0.0.2</version>
		</dependency>

Wenn spring-security-oauth2 gesetzt wurde, ändert der Quellcode einfach "@ EnableOAuth2Sso" in "@ EnableOAuth2Serializable". Es ist jedoch nutzlos, wenn "@ EnableOAuth2Sso" oder "@ EnableOAuth2Client" auch nur an einer Stelle verbleibt.

Klicken Sie hier für die Demo-Anwendung https://github.com/apc-hattori/spring-oauth2-demo

Klicken Sie hier, um den Unterschied beim Ändern ab dem Zeitpunkt von spring-security-oauth2 anzuzeigen https://github.com/apc-hattori/spring-oauth2-demo/compare/use-spring-security-oauth2...master

Recommended Posts

Spring Boot (1 Serie) + spring-security-oauth2 + Redis Session + Heroku mit SerializationException
Ändern Sie das Sitzungszeitlimit in Spring Boot
Legen Sie den Kontextparameter in Spring Boot fest
Spring Boot 2 Multiprojekt mit Gradle
NoHttpResponseException in Spring Boot + WireMock
Rufen Sie eine Liste anderer Sitzungen desselben Benutzers ab, wenn Sie Redis Session mit Spring Boot (Serie 2) verwenden. Entsorgen Sie es auch.
Frühlingsstiefel Hallo Welt in Eclipse
Spring Boot-Anwendungsentwicklung in Eclipse
Schreiben Sie den Testcode mit Spring Boot
Implementieren Sie die REST-API mit Spring Boot
Was ist @Autowired im Spring Boot?
Implementieren Sie die Spring Boot-Anwendung in Gradle
Rüsten Sie den Federstiefel von der 1.5-Serie auf die 2.0-Serie auf
Verwendung von Thymeleaf mit Spring Boot
Starten Sie mit IntelliJ ein (altes) Spring Boot-Projekt
Erstellen Sie mit Gradle ein Spring Boot + Docker-Image
Statische Dateizugriffspriorität beim Spring Boot
Spring Boot-Protokoll im JSON-Format ausgeben
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Lösen Sie die Thymeleaf-Syntaxprüfung in Spring Boot
[Trainieren! ] Zeigen Sie Hello World mit Spring Boot an
Verwenden Sie die DynamoDB-Abfragemethode mit Spring Boot
DI SessionScope Bean im Spring Boot 2-Filter
Testen Sie den Controller mit Mock MVC im Spring Boot
Asynchrone Verarbeitung mit regelmäßiger Ausführung in Spring Boot
Führen Sie ein Spring Boot-Projekt mit VS-Code aus
Anforderungs- und Antwortprotokolle mit Spring Boot ausgeben
Verwendung von Spring Boot-Sitzungsattributen (@SessionAttributes)
Die Geschichte der Erhöhung der Spring Boot 1.5-Serie auf die 2.1-Serie
Servlet-Filter mit Spring Boot verwenden [Spring Boot 1.x, 2.x kompatibel]
So fügen Sie in Spring Boot einen Klassenpfad hinzu
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
So binden Sie mit einer Eigenschaftendatei in Spring Boot
Anmerkungen, die in Spring Boot-Aufgabenverwaltungstools verwendet werden
Zeigen Sie die Gradle-Aufgabe im Spring Boot-Projekt an
Spring Boot - So stellen Sie das Sitzungszeitlimit ein