[JAVA] Spring Boot (série 1) + spring-security-oauth2 + Redis Session + Heroku avec SerializationException

Une exception SerializationException s'est produite lors de l'exécution sur Heroku avec une combinaison de Spring Boot (série 1) + spring-security-oauth2 + Redis Session. (Cela ne se produit pas avec une seule instance. Seulement avec plusieurs instances)

Cause et solution

À propos, si vous utilisez la série Spring Boot 2 (série Spring 5), vous devez utiliser la série Spring Security 5. (Pas essayé) Il est préférable qu'il puisse être mis à niveau vers la série Spring Boot 2 (série Spring 5).

Le problème semble être dans spring-security-oauth2. Il y a deux solutions qui sont sorties sur Google

  1. Lorsqu'une exception SerializationException se produit, supprimez la clé Redis. (id: blog de katsu68)
  2. Créez une session permanente (Paramètres de session persistante Heroku)

Si ce n'est que 1, étant donné que SerializationException se produit fréquemment sur Heroku, il est presque impossible de maintenir l'état de connexion. Dans le cas de seulement 2, cela n'a pas de sens d'avoir plusieurs instances, et lorsque le redémarrage s'exécute, une SerializationException se produit toujours.

Par conséquent, les deux mesures ont été prises. La session n'expire que lors du déploiement et du redémarrage de l'instance Heroku, mais j'ai décidé de l'utiliser pendant un certain temps.

Cependant, je ne sais pas quand Heroku sera redémarré (il peut être contrôlé dans une certaine mesure en redémarrant à tout moment). Les déconnexions fréquentes sont stressantes pour les utilisateurs.

Fait une bibliothèque

Pour éviter cela, j'ai décidé de faire moi-même un traitement. J'ai également décidé de le publier en tant que bibliothèque. -> Bibliothèque créée

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

Si spring-security-oauth2 a été défini, le code source remplace simplement «@ EnableOAuth2Sso» par «@ EnableOAuth2Serializable». Cependant, cela ne sert à rien si @ EnableOAuth2Sso ou @ EnableOAuth2Client reste même au même endroit.

Cliquez ici pour l'application de démonstration https://github.com/apc-hattori/spring-oauth2-demo

Cliquez ici pour la différence lors de la modification à partir du moment de seulement spring-security-oauth2 https://github.com/apc-hattori/spring-oauth2-demo/compare/use-spring-security-oauth2...master

Recommended Posts

Spring Boot (série 1) + spring-security-oauth2 + Redis Session + Heroku avec SerializationException
Modifier le délai d'expiration de la session dans Spring Boot
Définir le paramètre contextuel dans Spring Boot
Multi-projets Spring Boot 2 avec Gradle
NoHttpResponseException dans Spring Boot + WireMock
Obtenez une liste des autres sessions du même utilisateur lorsque vous utilisez Redis Session avec Spring Boot (série 2). Jetez-le également.
Spring Boot Hello World dans Eclipse
Développement d'applications Spring Boot dans Eclipse
Écrire du code de test avec Spring Boot
Implémenter l'API REST avec Spring Boot
Qu'est-ce que @Autowired dans Spring Boot?
Implémenter l'application Spring Boot dans Gradle
Mise à niveau de la botte à ressort de la série 1.5 à la série 2.0
Comment utiliser Thymeleaf avec Spring Boot
Lancer un (ancien) projet Spring Boot avec IntelliJ
Créer une image Spring Boot + Docker avec Gradle
Priorité d'accès aux fichiers statiques dans Spring Boot
Sortie du journal Spring Boot au format json
Créer un projet Java Spring Boot avec IntelliJ
Desserrer la vérification de la syntaxe de Thymeleaf dans Spring Boot
[Entraine toi! ] Affichez Hello World avec Spring Boot
Utiliser la méthode de requête DynamoDB avec Spring Boot
DI SessionScope Bean dans le filtre Spring Boot 2
Testez le contrôleur avec Mock MVC dans Spring Boot
Traitement asynchrone avec exécution régulière dans Spring Boot
Exécuter un projet Spring Boot avec VS Code
Sortie des journaux de demande et de réponse avec Spring Boot
Comment utiliser les attributs de session Spring Boot (@SessionAttributes)
L'histoire de la montée de la série Spring Boot 1.5 à la série 2.1
Utiliser le filtre de servlet avec Spring Boot [compatible Spring Boot 1.x, 2.x]
Comment ajouter un chemin de classe dans Spring Boot
Conseils Java - Créez un projet Spring Boot avec Gradle
Comment se lier avec un fichier de propriétés dans Spring Boot
Annotations utilisées dans les outils de gestion des tâches Spring Boot
Afficher la tâche Gradle dans le projet Spring Boot
Spring Boot - Comment définir le délai d'expiration de la session