【转】使用 Spring Session 做分布式会话管理

本贴最后更新于 2895 天前,其中的信息可能已经时移世异

在 Web 项目开发中,会话管理是一个很重要的部分,用于存储与用户相关的数据。通常是由符合 session 规范的容器来负责存储管理,也就是一旦容器关闭,重启会导致会话失效。因此打造一个高可用性的系统,必须将 session 管理从容器中独立出来。而这实现方案有很多种,下面简单介绍下:

  第一种是使用容器扩展来实现,大家比较容易接受的是通过容器插件来实现,比如基于 Tomcat 的 tomcat-redis-session-manager,基于 Jetty 的 jetty-session-redis 等等。好处是对项目来说是透明的,无需改动代码。不过前者目前还不支持 Tomcat 8,或者说不太完善。个人觉得由于过于依赖容器,一旦容器升级或者更换意味着又得从新来过。并且代码不在项目中,对开发者来说维护也是个问题。

  第二种是自己写一套会话管理的工具类,包括 Session 管理和 Cookie 管理,在需要使用会话的时候都从自己的工具类中获取,而工具类后端存储可以放到 Redis 中。很显然这个方案灵活性最大,但开发需要一些额外的时间。并且系统中存在两套 Session 方案,很容易弄错而导致取不到数据。

  第三种是使用框架的会话管理工具,也就是本文要说的 spring-session,可以理解是替换了 Servlet 那一套会话管理,既不依赖容器,又不需要改动代码,并且是用了 spring-data-redis 那一套连接池,可以说是最完美的解决方案。当然,前提是项目要使用 Spring Framework 才行。

  这里简单记录下整合的过程:

  如果项目之前没有整合过 spring-data-redis 的话,这一步需要先做,在 maven 中添加这两个依赖:

|

<``dependency``>

<``groupId``>org.springframework.data

<``artifactId``>spring-data-redis

<``version``>1.5.2.RELEASE

``

<``dependency``>

<``groupId``>org.springframework.session

<``artifactId``>spring-session

<``version``>1.0.2.RELEASE

``

|

  再在 applicationContext.xml 中添加以下 bean,用于定义 redis 的连接池和初始化 redis 模版操作类,自行替换其中的相关变量。

|

``

<``bean id``=``"jedisPoolConfig" class``=``"redis.clients.jedis.JedisPoolConfig"``>

``

<``bean id``=``"jedisConnectionFactory"

class``=``"org.springframework.data.redis.connection.jedis.JedisConnectionFactory"``>

<``property name``=``"hostName" value``=``"${redis.host}" />

<``property name``=``"port" value``=``"${redis.port}" />

<``property name``=``"password" value``=``"${redis.pass}" />

<``property name``=``"timeout" value``=``"${redis.timeout}" />

<``property name``=``"poolConfig" ref``=``"jedisPoolConfig" />

<``property name``=``"usePool" value``=``"true" />

``

<``bean id``=``"redisTemplate" class``=``"org.springframework.data.redis.core.StringRedisTemplate"``>

<``property name``=``"connectionFactory" ref``=``"jedisConnectionFactory" />

``

``

<``bean id``=``"redisHttpSessionConfiguration"

class``=``"org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"``>

<``property name``=``"maxInactiveIntervalInSeconds" value``=``"1800" />

``

|

  这里前面几个 bean 都是操作 redis 时候使用的,最后一个 bean 才是 spring-session 需要用到的,其中的 id 可以不写或者保持不变,这也是一个约定优先配置的体现。这个 bean 中又会自动产生多个 bean,用于相关操作,极大的简化了我们的配置项。其中有个比较重要的是 springSessionRepositoryFilter,它将在下面的代理 filter 中被调用到。maxInactiveIntervalInSeconds 表示超时时间,默认是 1800 秒。写上述配置的时候我个人习惯采用 xml 来定义,官方文档中有采用注解来声明一个配置类。

  然后是在 web.xml 中添加一个 session 代理 filter,通过这个 filter 来包装 Servlet 的 getSession()。需要注意的是这个 filter 需要放在所有 filter 链最前面。

|

``

<``filter``>

<``filter-name``>springSessionRepositoryFilter

<``filter-class``>org.springframework.web.filter.DelegatingFilterProxy

``

<``filter-mapping``>

<``filter-name``>springSessionRepositoryFilter

<``url-pattern``>/*

``

|

  这样便配置完毕了,需要注意的是,spring-session 要求 Redis Server 版本不低于 2.8。

  验证:使用 redis-cli 就可以查看到 session key 了,且浏览器 Cookie 中的 jsessionid 已经替换为 session。

|

127.0.0.1:6379> KEYS *

1) "spring:session:expirations:1440922740000"

2) "spring:session:sessions:35b48cb4-62f8-440c-afac-9c7e3cfe98d3"

|

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖
  • OpenCV
    15 引用 • 36 回帖 • 4 关注
  • 生活

    生活是指人类生存过程中的各项活动的总和,范畴较广,一般指为幸福的意义而存在。生活实际上是对人生的一种诠释。生活包括人类在社会中与自己息息相关的日常活动和心理影射。

    230 引用 • 1454 回帖
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    495 引用 • 931 回帖
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    89 引用 • 122 回帖 • 618 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 4 关注
  • 微服务

    微服务架构是一种架构模式,它提倡将单一应用划分成一组小的服务。服务之间互相协调,互相配合,为用户提供最终价值。每个服务运行在独立的进程中。服务于服务之间才用轻量级的通信机制互相沟通。每个服务都围绕着具体业务构建,能够被独立的部署。

    96 引用 • 155 回帖 • 2 关注
  • PWL

    组织简介

    用爱发电 (Programming With Love) 是一个以开源精神为核心的民间开源爱好者技术组织,“用爱发电”象征开源与贡献精神,加入组织,代表你将遵守组织的“个人开源爱好者”的各项条款。申请加入:用爱发电组织邀请帖
    用爱发电组织官网:https://programmingwithlove.stackoverflow.wiki/

    用爱发电组织的核心驱动力:

    • 遵守开源守则,体现开源&贡献精神:以分享为目的,拒绝非法牟利。
    • 自我保护:使用适当的 License 保护自己的原创作品。
    • 尊重他人:不以各种理由、各种漏洞进行未经允许的抄袭、散播、洩露;以礼相待,尊重所有对社区做出贡献的开发者;通过他人的分享习得知识,要留下足迹,表示感谢。
    • 热爱编程、热爱学习:加入组织,热爱编程是首当其要的。我们欢迎热爱讨论、分享、提问的朋友,也同样欢迎默默成就的朋友。
    • 倾听:正确并恳切对待、处理问题与建议,及时修复开源项目的 Bug ,及时与反馈者沟通。不抬杠、不无视、不辱骂。
    • 平视:不诋毁、轻视、嘲讽其他开发者,主动提出建议、施以帮助,以和谐为本。只要他人肯努力,你也可能会被昔日小看的人所超越,所以请保持谦虚。
    • 乐观且活跃:你的努力决定了你的高度。不要放弃,多年后回头俯瞰,才会发现自己已经成就往日所仰望的水平。积极地将项目开源,帮助他人学习、改进,自己也会获得相应的提升、成就与成就感。
    1 引用 • 487 回帖 • 2 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 159 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    166 引用 • 314 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 93 关注
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 85 关注
  • Excel
    31 引用 • 28 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 628 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 3 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 1 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 667 关注
  • HBase

    HBase 是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了 Google 文件系统所提供的分布式数据存储一样,HBase 在 Hadoop 之上提供了类似于 Bigtable 的能力。

    17 引用 • 6 回帖 • 58 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 35 关注
  • sts
    2 引用 • 2 回帖 • 227 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 162 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 5 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 115 关注
  • AWS
    11 引用 • 28 回帖 • 11 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖