spring-session之一 初探 spring-session
1.什么是spring-session
1.1 背景 -session会话共享
HttpSession
是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。
但是我们把应用搭建成分布式的集群,然后利用LVS或Nginx做负载均衡
,那么来自同一用户的Http请求将有可能被分发到两个不同的应用中。
那问题来了,如何保证不同的web站点能够共享同一份session数据呢?
最简单的想法,就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。
那问题又来了,如何替换掉Servlet容器创建和管理的HttpSession
的实现呢?
-
利用Servlet容器提供的
插件功能
,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。这方面其实早就有开源项目了,例如
memcached-session-manager
(目前我们的官方商城都是使用这个),以及tomcat-redis-session-manager
。
不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。 -
设计一个Filter,
利用HttpServletRequestWrapper
,实现自己的 getSession()方法,接管创建和管理Session数据的工作。spring-session
就是通过这样的思路实现的。
1.2 spring-session
简介
spring-session
是Spring的项目之一,
- 官网地址 : http://projects.spring.io/spring-session/
- GitHub地址:https://github.com/spring-projects/spring-session
spring-session
提供了一套创建和管理Servlet HttpSession的方案。spring-session
提供了集群Session(Clustered Sessions)功能,默认采用外置的Redis来存储Session数据,以此来解决Session共享的问题。
下面是来自官网的特性介绍:
Spring Session provides the following features:
- API and implementations for managing a user's session
- HttpSession - allows replacing the HttpSession in an application container (i.e. Tomcat) neutral way
- Clustered Sessions - Spring Session makes it trivial to support clustered sessions without being tied to an application container specific solution.
- Multiple Browser Sessions - Spring Session supports managing multiple users' sessions in a single browser instance (i.e. multiple authenticated accounts similar to Google).
- RESTful APIs - Spring Session allows providing session ids in headers to work with RESTful APIs
- WebSocket - provides the ability to keep the HttpSession alive when receiving WebSocket messages
2.自学源码使用 (以redis为例子)
步骤(参考 http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession.html):
- 先从
GitHub
https://github.com/spring-projects/spring-session 下载源码 - 本地安装
gradle
(略),参考 http://feitianbenyue.iteye.com/blog/2326268 - 本地安装
redis
(need 2.8+) 并启动(略) - 基于
spring-session
根目录,执行gradlew :samples:httpsession-xml:tomcatRun
然后可以打开 http://localhost:8080 ,可以看到以下界面,并且可以使用这个页面来设置session 属性
3.redis 里面的key
打开 redis-cli
,输入
keys *
结果:
可以看出,在 redis
里面的 spring-session
相关的 key 是以 spring:session:
开头
并且有以下的key
127.0.0.1:6379> keys spr*
1) "spring:session:expirations:1474542840000"
2) "spring:session:sessions:c3ae0dba-058e-4eca-99ad-6ec5225fd6e0"
3) "spring:session:sessions:expires:c3ae0dba-058e-4eca-99ad-6ec5225fd6e0"
至此,我们大概知道 spring-session 是什么东东, 大概怎么玩, 下面我们来聊聊项目中如何使用他
4.参考
- spring-session github地址
- spring-session 官网地址
- 利用spring session解决共享Session问题
- http://feitianbenyue.iteye.com/blog/2326268
- http://docs.spring.io/spring-session/docs/current/reference/html5/guides/httpsession.html
---to be continued
相关推荐
- **Session管理**:Spring MVC支持多种Session管理方式,确保会话数据的安全和有效性。 #### 五、PAFA业务层 **5.1 业务层介绍** 业务层是PAFA中负责处理业务逻辑的部分,主要包括以下几个方面: - **业务层...
《基于Hibernate+Spring+Struts的学生信息管理系统初探》 在Java开发领域,Spring、Hibernate和Struts是经典的“SSH”框架组合,常用于构建企业级应用,如本例中的学生信息管理系统。这个初级版系统展示了如何将这...
- **一级缓存**:NHibernate的一级缓存是Session级别的缓存,在同一个Session中多次读取同一数据时,NHibernate会从缓存中直接获取,而不是每次都访问数据库。 - **二级缓存**:用于跨Session的数据缓存,可以在多个...
《SSH框架下的学生选课系统初探》 SSH(Struts2、Spring、Hibernate)是Java Web开发中常用的三大框架,它们的组合为构建高效、灵活的企业级应用提供了可能。本篇文章将围绕“学生选课系统”这一主题,探讨如何利用...
【Java网上商城系统初探】 Java网上商城是一个基于Java技术构建的电子商务平台,它提供了商品浏览、购物车、订单处理、支付接口等核心功能。在本文中,我们将深入探讨Java网上商城的一些关键技术点和实现原理。 一...
总之,个人博客系统是一个理想的实践项目,能够帮助初学者快速上手JSP和Web开发,同时也可以为后续深入学习Java EE、Spring Boot等高级框架打下坚实基础。通过实际操作,你可以更加深刻地体验到JSP在构建动态网站时...