Cet article vous présente principalement les informations pertinentes sur l'utilisation de Spring, Session et redis pour partager des sessions. L'article le présente en détail à travers un exemple de code. Il a une certaine valeur d'apprentissage de référence pour les études ou le travail de chacun. , veuillez suivre l'éditeur pour apprendre ensemble.
Préface
Après avoir configuré l'environnement du cluster, un problème que nous devons considérer est de savoir comment gérer les sessions générées par l'accès des utilisateurs.
Il existe de nombreuses façons de traiter les sessions. Pour plus de détails, veuillez consulter le blog précédent republié : 5 stratégies de traitement de sessions dans des environnements cluster/distribués
Ici, nous discutez de la troisième méthode : le partage de session.
Le cluster Redis effectue une réplication maître-esclave et utilise la cohérence éventuelle de la base de données Redis pour stocker les informations de session dans Redis. Lorsque le serveur d'applications constate que la session ne se trouve pas dans la mémoire locale, il la recherche dans la base de données redis. La base de données redis étant une base de données indépendante du serveur d'applications, la session peut être partagée et hautement disponible.
Lacunes :
1. redis nécessite une grande mémoire, sinon la session utilisateur sera effacée du cache.
2. Le cache doit être rafraîchi régulièrement
La structure préliminaire est la suivante :
Cependant, cette structure pose toujours des problèmes. Le maître Redis est un goulot d'étranglement important. Si le maître plante, Redis n'effectuera pas activement le changement de maître et le service de session sera interrompu.
Mais créons d’abord cette structure, puis optimisons-la et modifions-la plus tard.
Spring Boot fournit Spring Session pour compléter le partage de session.
Documentation officielle : http://docs.spring.io/spring-session/docs/current/reference/html5/guides/boot.html#boot-sample
Créez d'abord un contrôleur simple :
@Controller public class UserController { @RequestMapping(value="/main", method=RequestMethod.GET) public String main(HttpServletRequest request) { HttpSession session = request.getSession(); String sessionId = (String) session.getAttribute("sessionId"); if (null != sessionId) { // sessionId不为空 System.out.println("main sessionId:" + sessionId); return "main"; } else { // sessionId为空 return "redirect:/login"; } } @RequestMapping(value="/login", method=RequestMethod.GET) public String login() { return "login"; } @RequestMapping(value="/doLogin", method=RequestMethod.POST) public String doLogin(HttpServletRequest request) { System.out.println("I do real login here"); HttpSession session = request.getSession(); String sessionId = UUID.randomUUID().toString(); session.setAttribute("sessionId", sessionId); System.out.println("login sessionId:" + sessionId); return "redirect:/main"; } }
Pour faire simple, il s'agit de simuler le contrôle des autorisations. Si le sessionId existe, accédez. la page d'accueil, sinon passez à la page de connexion.
Alors comment réaliser le partage de session ?
Ajoutez les dépendances suivantes :
<!-- spring session --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session</artifactId> <version>1.3.0.RELEASE</version> </dependency> <!-- redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency>
Ajouter une classe de configuration :
@EnableRedisHttpSession public class HttpSessionConfig { @Bean public JedisConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }
A quoi sert cette classe de configuration ?
Documentation officielle :
La configuration Spring est chargée de créer un filtre de servlet qui remplace l'implémentation de HttpSession par une implémentation soutenue par Spring Session
. En d’autres termes, cette classe de configuration peut créer un filtre qui prend en charge le fonctionnement de Spring Session à la place de HttpSession.
L'annotation @EnableRedisHttpSession crée un Spring Bean avec le nom springSessionRepositoryFilter qui implémente Filter. Le filtre est chargé de remplacer l'implémentation HttpSession qui doit être soutenue par Spring Session. L'annotation Redis.
@EnableRedisHttpSession créera un objet bean de springSessionRepositoryFilter pour implémenter ce filtre. Filter est responsable du remplacement de HttpSession.
En d'autres termes, HttpSession ne joue plus de rôle, mais utilise redis pour faire fonctionner directement la Session via des filtres.
Ajoutez la configuration Redis dans application.properties :
spring.redis.host=localhost spring.redis.password= spring.redis.port=6379
De cette façon, le partage de session est terminé. N'est-ce pas très simple ? Le code des affaires n’a même pas besoin d’une petite modification.
Vérification :
La base de données Redis est vide au début.
Exécutez le projet :
Après avoir accédé à la page, vous pouvez voir les informations de session dans redis.
Après vous être connecté avec désinvolture :
Entrez dans le principal. Cela signifie que le sessionId existe dans la session en cours.
Nous vérifions les cookies de la page en cours. En d'autres termes, ce cookie a sessionId.
Exécutez un nouveau projet avec le port 8081. Ouvrez un nouvel onglet directement dans le navigateur d'origine. Nous savons que le cookie est partagé à ce moment-là. Visitez localhost:8081/main
Nous avons directement accédé au nouveau projet avec succès ! ! Le même cookie peut être utilisé pour partager des sessions sur différents serveurs Web.
Enfin, j'insiste encore :
L'implémentation de HttpSession est remplacée par Spring Session Operating HttpSession équivaut à l'exploitation des données dans Redis.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!