Session 共享
- https://docs.spring.io/spring-session/docs/2.3.1.RELEASE/reference/html5/guides/boot-redis.html
配置
第一步
<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);
}
}
跨服务也要设置
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的增删改查封装类
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("/**");
}
}