背景

前段时间,项目计划搞独立的登录鉴权中心,由于单独开发一套稳定的登录、鉴权代码,工作量大,最终的方案是对开源鉴权中心CAS(Central Authentication Service)作适配修改。

实际应用中,web服务出于负载、容灾的考虑,采用集群部署web服务(一般是tomcat集群),于是有了CAS server端集群部署的需求。CAS集群部署,需要解决两个问题:

  • CAS票据共享,票据包括ST、TGT
  • Tomcat session共享

需要作tomcat session共享,是由spring webflow框架引入的需求。CAS从3.x的版本开始,使用Spring Webflow框架,该框架需要在Tomcat session中存储一些流程标识。默认配置下的tomcat,没有做到session共享,因此需要使用一些技术手段,来完成tomcat的session共享。本文,即使用tomcat-redis-session-manager作tomcat session共享的一些总结。

运行环境:jdk_6,tomcat7

Session共享配置

采用第三方插件,tomcat-redis-session-manager来实现tomcat session共享。顾名思义,这种方案,是将tomcat session存储到了redis(key value DB)中。

主要完成两部分配置:

    commons-pool-1.5.5.jar

    jedis-2.1.0.jar

    tomcat-redis-session-manager-1.1.jar

  • 修改tomcat conf目录下的context.xml配置文件,加上valve和manager配置段。其中maxInactiveInterval是session存储时长,单位是秒。

    <Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager" host="ip" port="port" database="0" maxInactiveInterval="second"/>

完成这两部配置,tomcat会把session放到redis中了。

Session不更新问题/解决

表面现象

在cas login页面,点击【提交/登录】按钮,只是刷新该页面,没有真正的表单提交、验证输入的用户名密码的动作。

原因分析

--------------------------------------------------**CAS背景知识 **--------------------------------------------------

看过CAS服务端源码的同学,会知道CAS登录页面会将下图中的三个属性,提交到CAS服务端的后台:

其中_eventId和lt是CAS的业务逻辑使用的,

excetion是Spring webflow框架使用的,作用是根据excetion,来确定是否需要初始化一个新的cas login webflow实例,如果传入的execution有效,进入之前的业务流。如果传入的execution无效,则会初始新的webflow ,并生成一个新的execution。

--------------------------------------------------**CAS背景知识 **--------------------------------------------------

redis存储tomcat session情况,CAS登录页面上元素【excetion】,多次刷新页面不更新。Tomcat session默认策略下(不做特殊配置时,tomcat session默认在内存中),该元素的值,会随页面刷新变更。

而使用tomcat-redis-session-manager默认的session策略,会导致总是传入无效的execution(笔者无效的execution为e2s1)。

查看源码,webflow根据execution获取会话,根据传入的e2s1,获取不到会话,进而重新生成execution。具体表现是重新刷新登录页面,不能走正常的“验证表单”流程。

带着问题继续看源码,execution无效,可能是webflow生成execution的时候出了问题。查看生成该属性值代码

context.assignFlowExecutionKey();

flowExecution.assignKey();

key = keyFactory.getKey(this);

   经历一系列内层调用,知道execution是根据session中key为webflowConversationContainer的属性生成的,具体属性包含以下内容:

  execution的值和session属性对象的字段conversationIdSequence(int类型)相关,如果conversationIdSequence值为,那execution的值即为e2--(conversationIdSequence自增1)。生成Execution的同时,正常情况session内容也相应变化,webflowConversationContainer属性中新增了id为2的conversation,session写入到redis中。

  但是,按照tomcat-redis-session-manager默认的session策略,webflowConversationContainer属性,key没有变,value地址没有变,认为session没有更新,新的session内容没有写入到redis中。导致下次请求,取到的webflowConversationContainer属性,没有id为2的conversation,于是cas server端认定execution 为无效。导致刷新页面,而非正常的流程:表单验证。

确认session没有写入redis的步骤

l  增加一个filter,加入session.getAttribute("webflowConversationContainer")这样的代码,可以看到session中的属性值,确实发生了变化;

l  根据JSESSIONID作为key,从redis中取到的session 串没有变化。

解决办法

l  按照《session同步时自定义类对象属性保存不上的解决方法》所述,修改tomcat-redis-session-manager 脏数据判定策略。

l  或者在增加一个filter,拦截login请求,新增一个key为”xxx_flag”,value为System.currentTimeMillis()的属性,这样,tomcat-redis-session-manager认定你的session数据是变化了的,会将新的session数据,写入到redis中,进而保证后续使用正常。

CAS 集群部署session共享配置的更多相关文章

  1. Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享

    Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...

  2. 集群中Session共享解决方案分析

    一.为什么要Session共享 Session存储在服务器的内存中,比如Java中,Session存放在JVM的中,Session也可以持久化到file,MySQL,redis等,SessionID存 ...

  3. 集群间Session共享问题解决方案

    两个基本概念的生命周期 session: 当新客户端发现一个HTTP请求时服务端会创建一个session.并分配一个sessionID作为服务端来客户端的识别,session对象会保存在服务端.此时s ...

  4. Tomcat集群的session共享

    配置Tomcat的session共享可以有三种解决方案: 第一种是以负载均衡服务器本身提供的session共享策略,每种服务器的配置是不一样的并且nginx本身是没有的. 第二种是利用web容器本身的 ...

  5. CAS 集群部署

    业务场景 单点登录服务器如果压力过大的情况,那么可以使用集群分担压力,但是cas 默认不支持session同步. 所以可以需要做session同步,可以使用j2cache 实现session同步.另外 ...

  6. Dubbo入门到精通学习笔记(十八):使用Redis3.0集群实现Tomcat集群的Session共享

    文章目录 1.单节点访问http://192.168.1.61:8082/pay-web-boss/: 2.增加多一个消费者节点:192.168.1.62,以同样的方式部署pay-web-boss工程 ...

  7. 关于 tomcat 集群中 session 共享的三种方法

    前两种均需要使用 memcached 或redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单 ...

  8. Java集群之session共享解决方案

    随着互联网的日益壮大,网站的pv和uv成线性或者指数倍的增加.单服务器单数据库早已经不能满足实际需求.比如像盛大,淘宝这样的大型网络公司,更是如此.     集群,也就是让一组计算机服务器协同工作,达 ...

  9. tomcat集群及session共享

    一般来说,java web app主要用作两个领域: 1.api.api一般是无状态的,所以无需考虑session共享的问题 2.传统web应用和网站,如crm,oa,erp,b2c,bbs等.尤其b ...

随机推荐

  1. Sony Z1 flashtool 刷机笔记

    第一次硬刷,(相较于recovery的卡刷)差点变成无限重启..记录一些关键步骤: 1 unlock bootloader http://developer.sonymobile.com/unlock ...

  2. C#发送邮件时提示:“不允许使用邮箱名称。服务器响应为:”的错误解决办法

    由于项目需要,要为客户提供一个定期发送邮件的程序.本来原来自己还写过,但新写的程序一晚上也没通过测试,总是提示"不允许使用邮箱名称.服务器响应为..." 经过在网上搜索查找解决办法 ...

  3. TortoiseSVN的合并对比工具TortoiseMerge启动时很慢很卡的解决办法

    用了新版本的TortoiseSVN,但是在进行文件版本对比或者是解决冲突的时候,每次都要等上好几秒钟,TortoiseMerge窗口才显示出来.在Visual Studio中使用这个作为SVN工具,也 ...

  4. sort a Python dictionary by value

    首先要明确一点,Python的dict本身是不能被sort的,更明确地表达应该是"将一个dict通过操作转化为value有序的列表" 有以下几种方法: 1. import oper ...

  5. Spark相关下载

    HBase: http://hbase.apache.org/ Hadoop hadoop.apache.org spark http://spark.apache.org/

  6. 【爬虫】BeautifulSoup之爬取百度贴吧的帖子

    在网上看到爬百度贴吧的例子,仿照写了一个用BeautifulSoup实现的,直接上代码吧 #coding:gbk import urllib2 from bs4 import BeautifulSou ...

  7. matlab备忘录

    1.使用运算符‘:’将矩阵的所有列拼成一列 2..'与'操作差别在复数运算时,'是复共轭转置,.'是转置 3.读取文件夹下的某类型文件 img_dir = dir('*.tif'); img_dir ...

  8. CS193P - 2016年秋 第三讲 Swift 语言及 Foundation 框架

    这一讲介绍一些 Swift 的重点概念.特别是一些有别于其它语言的地方.但本质上还都是语法糖. 想充分理解这一讲的内容,最好的方式就是 打开 playgound,亲自动手来实验. 1,Optional ...

  9. PHP会话管理:cookie和session

    PHP会话管理1.cookie数据存储在浏览器端方便与JavaScript交换数据方便获取用户信息风险-浏览器可能会禁用cookie替代方案-URL参数 2.session数据存储在服务器高效.安全. ...

  10. Python之路-(Django(Cookie、分页))

    Cookie 分页 1.获取Cookie: request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, sal ...