在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动。
主要从以下三个方面进行热脑:
-
为什么要spring-session
-
比较traditional-session方案和spring-session方案
-
JSR340规范与spring-session的透明继承
为什么要 spring-session
在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。
在开始spring-session揭秘之前,先做下热脑(活动活动脑子)运动。
主要从以下三个方面进行热脑:
为什么要spring-session
比较traditional-session方案和spring-session方案
JSR340规范与spring-session的透明继承
在传统单机web应用中,一般使用tomcat/jetty等web容器时,用户的session都是由容器管理。
Spring Session 为管理用户会话信息提供了API和实现。
Spring会话使支持集群会话变得很简单,无需绑定到特定于应用程序容器的解决方案。它还提供了透明的集成:
允许以中立的方式替换应用程序容器(即Tomcat)中的HttpSession,支持在header中提供会话id,以使用RESTful api
前面我们学习了springboot整合redis实现分布式session,对 spring session 有了一个最基本的认识。
有时候我们希望登陆的时候设置对应的 session 信息,然后结合拦截器进行是否登陆校验。
本文就给出一个结合拦截器使用的例子,让我们进一步感受下 spring session 的魅力吧。
使用 spring session 最核心的注解就是 @EnableRedisHttpSession
。
这个注解看起来非常简单,实际上却默默地为我们做了很多事情:
(1)使用 spring 自己实现的 Http 实现,替代原生的实现。对于开发者完全透明。
(2)将 session 的信息持久化到 redis
(3)针对 session 的持久化做了失效/安全性等多方面的考虑。
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Target({ java.lang.annotation.ElementType.TYPE })
@Documented
@Import(RedisHttpSessionConfiguration.class)
@Configuration
public @interface EnableRedisHttpSession {
// 默认是 30min
int maxInactiveIntervalInSeconds() default 1800;
// 命名空间默认为空
String redisNamespace() default "";
// 只有当前 SessionRepository#save() 调用时,才刷新 redis
RedisFlushMode redisFlushMode() default RedisFlushMode.ON_SAVE;
}
假如你在繁华的街角开了一家店,每天客人络绎不绝。
不过你作为老板却有一些苦恼,你想知道自己的顾客上一次是什么时候来的?
在店里的时候买了什么商品,方便购物的时候进一步提升用户体验。
可是这些客人赤果果的来,无牵挂的走,店里一直没有留下客人的信息,聪明的你会怎么解决这个问题呢?