文档章节

spring-session之一 初探 spring-session

飞天奔月
 飞天奔月
发布于 2016/09/23 11:10
字数 772
阅读 112
收藏 2

spring-session之一 初探 spring-session

1.什么是spring-session

1.1 背景 -session会话共享

HttpSession是通过Servlet容器创建和管理的,像Tomcat/Jetty都是保存在内存中的。 但是我们把应用搭建成分布式的集群,然后利用LVS或Nginx做负载均衡,那么来自同一用户的Http请求将有可能被分发到两个不同的应用中。

那问题来了,如何保证不同的web站点能够共享同一份session数据呢?

最简单的想法,就是把session数据保存到内存以外的一个统一的地方,例如Memcached/Redis等数据库中。 那问题又来了,如何替换掉Servlet容器创建和管理的HttpSession的实现呢?

  1. 利用Servlet容器提供的插件功能,自定义HttpSession的创建和管理策略,并通过配置的方式替换掉默认的策略。

    这方面其实早就有开源项目了,例如memcached-session-manager(目前我们的官方商城都是使用这个),以及tomcat-redis-session-manager。 不过这种方式有个缺点,就是需要耦合Tomcat/Jetty等Servlet容器的代码。

  2. 设计一个Filter,利用HttpServletRequestWrapper,实现自己的 getSession()方法,接管创建和管理Session数据的工作。spring-session就是通过这样的思路实现的。

1.2 spring-session简介

spring-session 是Spring的项目之一,

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):

  1. 先从 GitHub https://github.com/spring-projects/spring-session 下载源码
  2. 本地安装 gradle (略),参考 http://feitianbenyue.iteye.com/blog/2326268
  3. 本地安装 redis (need 2.8+) 并启动(略)
  4. 基于 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.参考

---to be continued

© 著作权归作者所有

飞天奔月

飞天奔月

粉丝 29
博文 13
码字总数 13014
作品 2
闸北
架构师
私信 提问
S - Spring security初探

现在很多企业和开发团队都使用了SSH2(Struts 2 +Spring 2.5 +Hibernate)框架来进行开发, 我们或许已经习惯了强大的Spring Framework 全局配置管理,不可否认,Sping是一个很优秀的开源框架...

JayPark不作死
2014/10/10
0
0
springboot之Redis的使用

spring boot对常用的数据库支持外,对nosql 数据库也进行了封装自动化。 redis介绍 Redis是目前业界使用最广泛的内存数据存储。相比memcached,Redis支持更丰富的数据结构,例如hashes, lis...

无语年华
2018/05/09
0
0
Spring Session Apple SR1 发布,修复了一些小故障

Spring Session Apple SR1 已发布,有关 Spring Session 的模块变更可点此查看。该版本修复了 版本中的一些小故障,建议升级。 各模块和依赖的版本 MODULE VERSION Spring Session Core Spr...

局长
2018/03/04
524
1
初探Spring Cloud(一)

什么是Spring Cloud? Spring提供了一系列工具,可以帮助开发人员迅速搭建分布式系统中的公共组件(比如:配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,主...

__HuWei
2018/12/10
0
0
Spring Boot 使用 Spring Session 集成 Redis 实现Session共享

Spring Boot 使用 Spring Session 集成 Redis 实现Session共享 《Spring Boot 2.0极简教程》—— 基于 Gradle + Kotlin的企业级应用开发最佳实践 通常在web开发中,Session 会话管理是很重要...

程序员诗人
2018/04/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

趣谈预留实例券,一文搞懂云上省钱最新玩法

摘要: 一文搞懂时髦的预留实例券(RI) ECS近期推出了预留实例券(Reserved Instances),简称RI,这东西很cool,今天我们聊聊这个。 首先这篇Blog不是文档,读完后想详细了解文档的朋友请点...

zhaowei121
21分钟前
0
0
js 将json字符串转换为json对象的方法解析

js 将json字符串转换为json对象的方法解析 将json字符串转换为json对象的方法。在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之...

城市之雾
22分钟前
1
0
国外青少年最喜爱的聊天 app,竟然是 Google Docs

简评: 这还真不是标题党,Google Docs 的协作中内置了实时聊天的功能,也可以进行 comments,颇有种现代「传纸条」的既视感。其实国内的石墨文档、腾讯文档等协作工具也有类似的效果,本文很...

极光推送
27分钟前
0
0
用zuul将微服务的多个swagger api文档聚合成一个文档

1.在每个服务的pom中添加以下依赖 <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId></dependency> 注意:仅仅需要添加这个就行。zuul负......

xtof
27分钟前
0
0
为什么取不到metamask的账号?

当你使用Metamask测试以太坊DApp时,如果出现莫名其妙的问题,检查一下web3.eth.accounts是否可以获取到账户,如果不能获取的话,那么最大的可能是你使用了新版的Metamask,并且默认启用了隐...

汇智网教程
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部