Maison >Java >javaDidacticiel >Comment résoudre les problèmes courants en utilisant SpringSession dans la version SpringBoot2.x

Comment résoudre les problèmes courants en utilisant SpringSession dans la version SpringBoot2.x

王林
王林avant
2023-05-17 14:34:461140parcourir

Piège SpringBoot2.x SpringSession

Exception rencontrée lors de l'initialisation du contexte - annulation de la tentative d'actualisation : org.springframework.beans.factory.BeanCreationException : erreur lors de la création du bean portant le nom 'org.springframework.boot.autoconfigure.session.SessionAutoConfiguration$ServletSessionRepositoryValidator' : L'appel de la méthode init a échoué ; l'exception imbriquée est org.springframework.boot.autoconfigure.session.SessionRepositoryUnavailableException : aucun référentiel de session n'a pu être configuré automatiquement, vérifiez votre configuration (le type de magasin de session est "redis")

Cela est dû à un élément manquant. Dépendance Spring-session-data-redis.

À propos de SpringBoot2. -data-redis est chargé et l'utilisateur doit ajouter les dépendances entre spring-session et redis.

Piège de Springboot 2.x - l'interdomaine provoque des problèmes de session

Actuellement, le courant dominant dans l'industrie informatique est de séparer le front-end et le back-end, mais il y aura certainement des problèmes inter-domaines pendant le processus de séparation.

Qu’est-ce que le cross-domain ?

signifie que lorsque le navigateur demande des ressources d'une page Web d'un nom de domaine à un autre nom de domaine, si le nom de domaine, le port ou le protocole sont différents, il s'agit d'un inter-domaine.

Scènes rencontrées

Lorsque nous utilisons springboot + shrio +vue pour réaliser des projets de gestion en arrière-plan, nous ne pouvons pas obtenir l'utilisateur actuellement connecté de shiroSession

Nous avons donc vérifié, et il a été dit en ligne que nous pouvions simplement laisser la session. passer lors de la traversée de domaines

Backend

 <!--SpringSession依赖-->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-core</artifactId>
 </dependency>
 <!--SpringSessionRedis依赖-->
 <dependency>
  <groupId>org.springframework.session</groupId>
  <artifactId>spring-session-data-redis</artifactId>
 </dependency>

Frontend

#使用使用Redis缓存session数据
spring.session.store-type=REDIS
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器端口号
spring.redis.port=6379

Mais cela ne fonctionne toujours pas après l'avoir configuréAprès une journée de Baidu et de dépannage, je suis revenu à Springboot 1.x et là. Il n'y avait pas de problème, j'ai donc décidé de passer à Springboot. La cause de 2.x, eh bien, le meurtrier a été attrapé. Maintenant, je peux prescrire le bon médicament. Je suis allé en ligne pour lire les problèmes liés à la mise à niveau de Springboot vers 2.x. séance de printemps.

Enfin découvert un nouveau monde. Dans la session de printemps 2.x, SameSite est en fait introduit dans Cookie. Sa valeur par défaut est Lax. D'accord, regardons ce que c'est ?

SameSite Cookie est utilisé pour empêcher les attaques CSRF. Il a deux valeurs : Strict, Lax

SameSite = Strict :

signifie mode strict, indiquant que ce cookie n'est en aucun cas possible. cookie tiers ;

SameSite = Lax :SameSite = Strict:

意为严格模式,表明这个cookie在任何情况下都不可能作为第三方cookie;

SameSite = Lax:

signifie mode détendu. Il peut être utilisé comme cookie tiers dans les requêtes GET, mais il ne peut pas contenir de cookies pour l'accès aux publications inter-domaines ( c'est très pénible Oui, notre interface de vérification est la requête POST)

Résumé : Les requêtes frontales au backend, et chaque session est différente à chaque fois, c'est une nouvelle session, ce qui entraîne l'impossibilité d'obtenir des informations sur l'utilisateur

.

Solution :

Définissez SameSite pour qu'il soit vide

@Configuration
public class CorsConfig {
    private CorsConfiguration buildConfig() {
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.setAllowCredentials(true);
        // 允许任何域名使用
        corsConfiguration.addAllowedOrigin("*");
        // 允许任何头
        corsConfiguration.addAllowedHeader("*");
        // 允许任何方法(post、get等)
        corsConfiguration.addAllowedMethod("*");
        corsConfiguration.setMaxAge(3600L);
        return corsConfiguration;
    }
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        // 对接口配置跨域设置
        source.registerCorsConfiguration("/**", buildConfig());
        return new CorsFilter(source);
    }
}

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer