SpringSession resuelve el problema de la no sincronización y el no intercambio de sesiones distribuidas

Guardamos la sesión en auth.gulimall.com, pero la URL se redirige a gulimall.com, y la sesión guardada en auth.gulimall.com no se puede recuperar, lo que provoca el problema asincrónico de la sesión en los microservicios. El
mismo servicio de replicación Múltiple , pero la sesión solo se puede guardar en un servicio y el navegador solo puede leer la sesión de un servicio

Agregar dependencia:

 <!--        整合Spring Session完成session共享问题 微服务自治,就不放在common里了-->
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

Agregue información de configuración en el archivo application.properties

#session存储类型
spring.session.store-type=redis
#session存储时间,30分钟
server.servlet.session.timeout=30m

Agregue la anotación @EnableRedisHttpSession a la clase de inicio GulimallAuthServerApplication para integrar redis como almacenamiento de sesión

//开启feign客户度的远程调用功能gulimall-auth-server
//扫描feign文件夹下的带有@FeignClient注解的接口
/**
 * Spring Session 核心原理
 * @EnableRedisHttpSession 导入RedisHttpSessionConfiguration配置
 * 装饰者模式
 * 自动延期 redis中的数据是有过期时间的
 */
@EnableFeignClients(basePackages = "com.atguigu.gulimall.auth.feign")
@EnableDiscoveryClient
@SpringBootApplication
@ComponentScan("com.hjh")
@EnableRedisHttpSession//整合redis作为session储存
public class GulimallAuthServerApplication {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(GulimallAuthServerApplication.class, args);
    }
}

Agregar una clase de configuración de sesión personalizada

//开启Spring Session功能 redis
@EnableRedisHttpSession
@Configuration
public class GulimallSessionConfig {
    
    

    /**
     * 自定义session作用域:整个网站
     * 使用一样的session配置,能保证全网站共享一样的session
     */
    @Bean
    public CookieSerializer cookieSerializer() {
    
    

        DefaultCookieSerializer defaultCookieSerializer = new DefaultCookieSerializer();
        //一级域名就是gulimall.com,那么其子域名都可以共享session
        defaultCookieSerializer.setDomainName("gulimall.com");
        defaultCookieSerializer.setCookieName("GULISESSION");

        return defaultCookieSerializer;
    }

    /**
     * json序列化机制
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer(){
    
    

        return new GenericJackson2JsonRedisSerializer();
    }
}

Demostración del código de inicio de sesión, cuando el usuario inicia sesión, guarde la información del usuario en la sesión

@PostMapping("/login")
    public String login(UserLoginVo vo, RedirectAttributes redirectAttributes, HttpSession session) {
    
    

        //远程登录
        R r = memberFeignService.login(vo);
        if (r.getCode() == 0) {
    
    
            //远程登录成功,将远程服务返回的entity放入session中
            MemberResVo memberResVo = r.getData("data", new TypeReference<MemberResVo>(){
    
    });
            session.setAttribute("loginUser", memberResVo);
            return "redirect:http://gulimall.com";
        }else {
    
    
            //远程登录失败
            Map<String, String> errors = new HashMap<>();
            errors.put("msg", r.getData("msg", new TypeReference<String>(){
    
    }));
            redirectAttributes.addFlashAttribute("errors", errors);
            return "redirect:http://auth.gulimall.com/login.html";
        }
    }

Una vez que el inicio de sesión es exitoso, los datos se guardarán en redis. La
Inserte la descripción de la imagen aquí
interfaz puede obtener directamente el valor en la sesión.

<ul>
   <li>
       <a th:if="${session.loginUser!=null}">欢迎您: [[${session.loginUser == null
           ?'':session.loginUser.nickname}]]</a>
       <a href="http://auth.gulimall.com/login.html" th:if="${session.loginUser==null}">欢迎您 ,请登录</a>
   </li>
   <li>
       <a th:if="${session.loginUser == null}" class="li_2"
          href="http://auth.gulimall.com/reg.html">免费注册</a>
   </li>
   <span>|</span>
   <li>
       <a href="http://member.gulimall.com/memberOrder.html">我的订单</a>
   </li>
</ul>

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/u014496893/article/details/113956268
Recomendado
Clasificación