场景值1
一个维护了几百年的单体老项目,突然就火起来了,访问人数突然暴增,服务器资源告急,担心一下驾崩,老板一个电话过来跟你说:“!4@!#!!¥@!¥1¥@!”,然后你得大半夜从睡梦中醒来屁颠屁颠的整服务器。
场景值2
下班了,准备发完版本就回去。等等,老板还在演示,又不能中断服务器去部署应用。一不小心,一个钟过去了,还没结束,你得等啊等啊,终于可以发布了。然后你利索的./shutdown下去,代码啪啦啪啦的上传完,准备启动了,盯着启动日志,天哪,怎么log卡住不动了。然后客服机立马就有人来找你麻烦了。
更多场景值,此处省略好多 ...
Spring Session是什么
-
Spring Session提供了一个管理用户会话信息的API和实现。它还提供透明的整合:
- HttpSession - 允许以应用程序容器(即Tomcat)中立的方式替换HttpSession。其他功能包括:
- 群集会话 - Spring Session使得支持群集会话变得轻而易举,而不会受限于特定于应用程序容器的解决方案。
- 多个浏览器会话 - 春季会话支持在单个浏览器实例中管理多个用户的会话(即与Google类似的多个经过身份验证的帐户)。
- RESTful API - Spring Session允许在头文件中提供会话标识符以使用RESTful API
- WebSocket - 提供HttpSession在接收WebSocket消息时保持活动状态的能力
白话:spring session抽象了一套API,并基于这套API对servlet容器提供的session进行无侵入集成,比如使用redis进行session管理,实现所谓的分布式session。
Spring Session坐标
以Maven做为依赖管理,基于redis的Spring Session实现
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.0.2.RELEASE</version>
<type>pom</type>
</dependency>
Spring Session怎么使用
Spring session对主流的Servlet容器如Tomcat提供透明的整合HttpSession。这意味着开发人员使用HttpSession可借助Spring Session支持的实现切换实现。
使用redis
Redis有多种客户端实现,常用的有Jedis和Lettuce。具体差别读者可另行翻阅其他资料。本文以Jedis为例。
-
基于java配置
-
Sring Java配置
@EnableRedisHttpSession public class Config{ @Bean public LettuceConnectionFactory connectionFactory() { return new JedisConnectionFactory(); } }
说明:默认的
JedisConnectionFactory()
构造方法是链接localhost:6379无密码的redis-server,实际生产环境可按需选择合适的构造方法。 -
Java Servlet容器初始化
Spring配置创建了一个名为springSessionRepositoryFilter
实现的Spring Bean Filter。该springSessionRepositoryFilterbean
负责HttpSession用Spring Session支持的自定义实现来替换它。为了让我们Filter发挥它的魔力,Spring需要加载Config.java。最后,我们需要确保我们的Servlet容器(即Tomcat)使用我们
springSessionRepositoryFilter
的每个请求。
幸运的是,Spring Session提供了一个AbstractHttpSessionApplicationInitializer
,继承它,把配置传入进去即可,代码如下:public class Initializer extends AbstractHttpSessionApplicationInitializer { publicInitializer() { super(Config.class); } }
-
-
基于xml配置
-
bean 配置
<context:annotation-config /> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration" /> <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.password}" />
基于xml的配置也相当简单,这里注意一下p命名空间,添加引用
xmlns:p="http://www.springframework.org/schema/p"
-
web.xml 配置 filter
<filter> <filter-name>springSessionRepositoryFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSessionRepositoryFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>
-
到此为止,应用已经集成了Spring Session,感觉不要太爽了!
测试Spring Session
- 把浏览器本地缓存先清一清
- 输入访问地址 http://localhost:8080/login
注意看中间的红色部分,没有了原来的jessionid
,但是新增了 session
。这是实现分布式session的关键。
- 登录系统,访问到主页
- 关闭服务器,重启
- 刷新页面,咦?不需要重新登录?
集群部署(负载均衡)
这里不是本文重点,就不展开细说了,由于上面已经解决了应用服务器session共享的问题,所以集群实现也是非常的简便,通过nginx反向代理到2个部署到应用的tomcat即可。
推荐
ifast是一款基于Spring Boot + Mybatis + Mybatis Plus搭建的快速开发平台。ifast集成了代码生成器,具有高效的开发效率。以Spring Boot为基础框架,Mybatis plus为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,基于Bootstrap构建的hplus作为前端框架。
访问请点击 Java快速开发脚手架 ifast
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。