Session 共享

  • https://docs.spring.io/spring-session/docs/2.3.1.RELEASE/reference/html5/guides/boot-redis.html image.png

image.png

image.png

image.png

image.png

image.png

image.png

配置

第一步
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>
spring.session.store-type=redis
 第二
 spring.session.store-type=redis
 server.servlet.session.timeout=30m
 第三
 配置redis 链接信息
 第四 开启springsession 功能 Application
 @EnableRedisHttpSession //开启功能
 public class ProductApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProductApplication.class, args);
    }
}

 跨服务也要设置

image.png

HttpSession session

//提取信息
MemberRespVo data = oauthlogin.getData("data", new TypeReference<MemberRespVo>() {});
System.out.println("登陆成功" + data.toString());
log.info("用户登陆成功:{}",data.toString());
//JSESIONID 保存session 父域名 下面子域名  都能使用
session.setAttribute("loginUser",data);

<li>
  <a rel="nofollow" href="http:">你好,请登录[[${session.loginUser.nickname}]]</a>
</li>
  • 解决子域共享session Spring Session
GulimallSessionConfig
@Configuration
public class GulimallSessionConfig {
    @Bean
    public CookieSerializer cookieSerializer(){
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setDomainName("gulimall.com");//自定义放大作用域
        cookieSerializer.setCookieName("GULISESSION");//自定义名字
        return cookieSerializer;
    }
    
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        //json序列化机制 保存方式
        return new GenericJackson2JsonRedisSerializer();
    }
}

 核心原理
@EnableRedisHttpSession导入RedisHttpSessionConfiguration配置
给容器中添加了一个组件RedisOperationsSessionRepository:Redis操作session,session的增删改查封装类

image.png

image.png

spring session 使用

配置文件

引入了POM.XML依赖 分别引入session 和redis
<dependency>
    <groupId>org.springframework.session</groupId>
    <artifactId>spring-session-data-redis</artifactId>
</dependency>

# lettuce 作为底层会有内存泄漏问题 所以排除掉 并切换为Jedis操作
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

配置application.properties 设置session使用redis存储
# 配置session
spring.session.store-type=redis
server.servlet.session.timeout=30m
# 配置 redis链接地址
spring.redis.host=192.168.56.10

配置Session配置文件 解决子域共享session Spring Session GulimallSessionConfig

@Configuration
public class GulimallSessionConfig {
    @Bean
    public CookieSerializer cookieSerializer(){
        DefaultCookieSerializer cookieSerializer = new DefaultCookieSerializer();
        cookieSerializer.setDomainName("gulimall.com");//自定义放大作用域
        cookieSerializer.setCookieName("GULISESSION");//自定义名字
        return cookieSerializer;
    }
    
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        //json序列化机制 保存方式
        return new GenericJackson2JsonRedisSerializer();
    }
}
 核心原理
@EnableRedisHttpSession导入RedisHttpSessionConfiguration配置
给容器中添加了一个组件RedisOperationsSessionRepository:Redis操作session,session的增删改查封装类

最后 加上@EnableRedisHttpSession 起作用
@EnableRedisHttpSession
@SpringBootApplication
public class GulimallOrderApplication {}

处理订单登录拦截 定义一个拦截器 和web配置让其起作用

@Component
public class LoginUserInterceptor implements HandlerInterceptor {
    //ThreadLocal 共享数据
    public static ThreadLocal<MemberRespVo> loginUser = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        MemberRespVo attribute = (MemberRespVo) request.getSession().getAttribute(AuthServerConstant.LOGINUSER);
        if (attribute != null) {
            //attribute 放入loginUser 其他都能访问到
            loginUser.set(attribute);
            return true;
        } else {
            request.getSession().setAttribute("msg", "请先登录");
            //没登录就去登录,从定向到登录界面
            response.sendRedirect("http://auth.gulimall.com/login.html");
            return false;
        }
    }
}
@Configuration
public class OrderWebConfiguration implements WebMvcConfigurer {
    @Autowired
    LoginUserInterceptor loginUserInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //所有路径请求都要拦截
        registry.addInterceptor(loginUserInterceptor).addPathPatterns("/**");
    }
}