浏览 5695 次
锁定老帖子 主题:bboss session共享使用方法介绍
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2014-05-10
最后修改:2015-03-18
1.会话共享组件eclipse工程 https://github.com/bbossgroups/bbossgroups-3.5/blob/master/bboss-security 下载下来导入eclipse即可,session共享组件与令牌组件都隶属于bboss security工程。 session共享服务器采用mongodb来存储会话信息和会话数据。 2.会话共享组件架构特点 bboss会话共享组件架构特点如下: http://yin-bp.iteye.com/blog/2079685 3.会话共享组件作用 为应用提供统一会话管理功能,避免集群部署场景下负载切换session丢失问题; 跨域跨应用共享会话并实现SSO功能; 解决了会话共享五大技术难题: session数据序列化问题, session sticking问题, 跨域跨应用session共享问题, 跨容器(tomcat,jetty,weblogic)共享session问题, sso单点登入单点登出一致性问题。 4.会话共享组件过滤器配置 bboss开发的平台中,为了避免重复配置,会话共享组件过滤器共用bboss字符过滤器com.frameworkset.common.filter.CharsetEncodingFilter,CharsetEncodingFilter是bboss session过滤器组件的子类: org.frameworkset.security.session.impl.SessionFilter 应用系统也可以直接使用org.frameworkset.security.session.impl.SessionFilter作为session共享拦截器使用。 <filter> <filter-name>CharsetEncoding</filter-name> <filter-class>com.frameworkset.common.filter.SessionCharsetEncodingFilter</filter-class> <init-param> <param-name>RequestEncoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>ResponseEncoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>mode</param-name> <param-value>0</param-value> </init-param> <init-param> <param-name>checkiemodeldialog</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>refererDefender</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>wallfilterrules</param-name> <param-value><![CDATA[><,%3E%3C,<iframe,%3Ciframe,<script,%3Cscript,<img,%3Cimg,alert(,alert%28,eval(,eval%28,style=,style%3D,[window['location'],{valueOf:alert},{toString:alert},[window["location"],new Function(]]> </param-value> </init-param> <init-param> <param-name>wallwhilelist</param-name> <param-value><![CDATA[content,fileContent,extfieldvalues,questionString]]> </param-value> </init-param> </filter> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>*.frame</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>*.page</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>*.freepage</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>/cxfservices/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharsetEncoding</filter-name> <url-pattern>/jasperreport/*</url-pattern> </filter-mapping> 只有符合filter-mapping对应规则的url请求,session才会具有会话共享功能。 5.会话共享组件配置 集群应用会话共享模式 配置文件路径:/resources/sessionconf.xml,sessionconf.xml文件只要编译到classes的跟目录下即可 <properties> <!-- 会话共享配置:但应用集群会话共享配置实例 --> <property name="sessionManager" class="org.frameworkset.security.session.impl.SessionManager" init-method="init" destroy-method="destroy"> <property name="sessionTimeout" value="3600000"/> <property name="sessionstore" refid="attr:sessionstore"/> <!-- <property name="sessionstore" value="session"/>--> <property name="cookiename" value="b_sessionid"/> <property name="httpOnly" value="true"/> <property name="secure" value="false"/> <!-- <property name="sessionlisteners" value="org.frameworkset.security.session.impl.NullSessionListener"/> --> <property name="startLifeScan" value="false"/> </property> <property name="sessionStaticManager" class="org.frameworkset.security.session.statics.MongoSessionStaticManagerImpl"/> <property name="sessionstore" class="org.frameworkset.security.session.impl.MongDBSessionStore"/> </properties> sessionManager配置说明: org.frameworkset.security.session.impl.SessionManager是bboss提供的session会话管理组件。 sessionTimeout-属性指定会话超时时间,单位:毫秒,-1或0标识session永不超时。 sessionstore-指定session的存储机制,session表示会话使用容器默认的会话管理机制,配置为MongDBSessionStore时则启用bboss的会话管理机制 cookiename-指定会话cookie名称 httpOnly-指定会话cookie是否使用httponly模式,true和false两个值,默认为true secure –结合https阻止传输过程中sessionid被窃取 appcode-应用编码,如果没有指定appcode值默认为应用上下文 appcode的作用:当所有的应用上下文为“/”时, 用来区分后台统计的会话信息, 如果应用上下文为“/”时,appcode为ROOT sessionlisteners-指定session监听器,多个listener可以按照顺序以逗号分隔填入即可,listener只有在bboss管理会话的时候才有用,每一个listener必须实现接口: package org.frameworkset.security.session; public interface SessionListener { public void createSession(SessionEvent event); public void destroySession(SessionEvent event); public void addAttribute(SessionEvent event); public void removeAttribute(SessionEvent event); } startLifeScan-是否在当前应用中启用失效会话扫描机制,true启用,false不启用,默认为false,一般所有连接到同一mongodb的应用在本地都会关闭失效会话扫描机制,而统一由独立的失效会话扫描服务应用(开启扫描机制)来负责失效会话扫描和销毁失效会话,这样可以提升应用性能。 sessionstore用来指定session的存储组件实现类,目前只提供了mongodb的存储机制: org.frameworkset.security.session.impl.MongDBSessionStore 通过插件扩展机制,可以采用redis和memcache来存储会话对象。 sessionStaticManager组件是bboss会话共享组件的监控统计组件: <property name="sessionStaticManager" f:monitorScope="all" class="org.frameworkset.security.session.statics.MongoSessionStaticManagerImpl"/> sessionStaticManager组件的monitorScope属性用来指定监控的应用范围, self:表示只能监控管理本应用的会话数据(默认值) all:表示监控管理所有应用的会话数据 出于安全性考虑,接入同一个mongodb的应用系统只能管理和监控本应用的会话数据,monitorScope为self,统一监控中心管理和监控所有应用系统的会话数据,这时monitorScope被指定为all。 管理功能包括会话应用库的删除,批量删除应用会话,清空应用下所有会话,按特定条件查询会话,查看会话详细信息(会话基本信息,会话中存放的属性数据(序列化后的xml串))。会话应用库的删除只能在监控中心进行,而且不能删除监控中心对应的会话应用,这个功能要慎用。 删除会话信息时不会删除管理用户对应的会话对象。 管理界面: 会话共享组件集成到跨域应用配置: <properties> <!-- 会话共享配置:跨越配置实例 --> <property name="sessionManager" class="org.frameworkset.security.session.impl.SessionManager" init-method="init" destroy-method="destroy"> <property name="sessionTimeout" value="3600000"/> <property name="sessionstore" refid="attr:sessionstore"/> <!-- <property name="sessionstore" value="session"/>--> <property name="cookiename" value="b_sessionid"/> <property name="httpOnly" value="true"/> <property name="secure" value="false"/> <!-- 应用编码,如果没有指定appcode值默认为应用上下文 appcode的作用:当所有的应用上下文为“/”时,用来区分后台统计的会话信息 如果应用上下文为“/”时,appcode为ROOT 当启用跨域会话共享时,就必须指定appcode --> <property name="appcode" value="pdp"/> <!-- domain:指定跨域共享的根域,基于该域名的子域名都可以共享session shareSessionAttrs:配置需要在应用间共享的会话数据属性名称,以逗号分隔;如果没有配置shareSessionAttrs属性,则所有的属性都是共享数据 domainApps:指定需要session共享的应用列表,每个应用必须指定path属性(对应应用上下文路径),如果应用指定了attributeNamespace属性,则用attributeNamespace对应的值来限定应用私有的会话数据名称 每个app的attributeNamespace属性只有在CrossDomain上指定了shareSessionAttrs属性才有意义 path:共享session的应用上下文名称 attributeNamespace:共享session应用私有session属性名称命名空间,用来限定应用私有session数据的存储空间 ,如果指定了shareSessionAttrs则必须指定每个应用的attributeNamespace 通过下面的配置,可以实现以下三个应用之间的会话共享和单点登录功能,应用的访问地址分别为: http://pdp.bboss.com.cn:8080/PDP http://g4.bboss.com.cn:169/g4studio http://test.bboss.com.cn:8080/WebRoot 上面三个应用的用户会话信息存储在session的CREDENTIAL_INDEXS,PRINCIPAL_INDEXS两个共享属性中,所以可以实现三个应用的单点登录功能 如果需要共享跟多的会话数据,可以将对应的属性追加到shareSessionAttrs中(以逗号分割),没有出现在shareSessionAttrs中的属性都是私有会话数据(对其他应用不可见)。 如果没有指定shareSessionAttrs,则会话数据全部在三个应用间共享。 --> <property name="crossDomain" class="org.frameworkset.security.session.domain.CrossDomain" f:domain="bboss.com.cn" f:shareSessionAttrs="CREDENTIAL_INDEXS,PRINCIPAL_INDEXS" init-method="init"> <property name="domainApps"> <list componentType="bean"> <property class="org.frameworkset.security.session.domain.App" f:path="/PDP" f:currentApp="true" f:attributeNamespace="pdp_bboss_com_cn" init-method="init" /> <property class="org.frameworkset.security.session.domain.App" f:path="/g4studio" f:currentApp="false" f:attributeNamespace="g4_bboss_com_cn" init-method="init" /> <property class="org.frameworkset.security.session.domain.App" f:path="/WebRoot" f:currentApp="false" f:attributeNamespace="testpdp_bboss_com_cn" init-method="init" /> </list> </property> </property> <!-- <property name="sessionlisteners" value="org.frameworkset.security.session.impl.NullSessionListener"/> --> </property> <property name="sessionStaticManager" class="org.frameworkset.security.session.statics.MongoSessionStaticManagerImpl"/> <property name="sessionstore" class="org.frameworkset.security.session.impl.MongDBSessionStore"/> </properties> 跨域应用session共享配置相比集群会话共享只需添加appcode 和crossDomain 两个属性即可: <property name="appcode" value="pdp"/> <property name="crossDomain" class="org.frameworkset.security.session.domain.CrossDomain" f:domain="bboss.com.cn" f:shareSessionAttrs="CREDENTIAL_INDEXS,PRINCIPAL_INDEXS" init-method="init"> <property name="domainApps"> <list componentType="bean"> <property class="org.frameworkset.security.session.domain.App" f:path="/PDP" f:currentApp="true" f:attributeNamespace="pdp_bboss_com_cn" init-method="init" /> <property class="org.frameworkset.security.session.domain.App" f:path="/g4studio" f:currentApp="false" f:attributeNamespace="g4_bboss_com_cn" init-method="init" /> <property class="org.frameworkset.security.session.domain.App" f:path="/WebRoot" f:currentApp="false" f:attributeNamespace="testpdp_bboss_com_cn" init-method="init" /> </list> </property> </property> 会话共享组件集成到跨域应用相关属性说明(这里只说明跨域session共享相关属性,其他属性参考集群模式会话共享属性说明部分): domain:指定跨域共享的根域,基于该域名的子域名都可以共享session shareSessionAttrs:配置需要在应用间共享的会话数据属性名称,以逗号分隔;如果没有配置shareSessionAttrs属性,则所有的属性都是共享数据 domainApps:指定需要session共享的应用列表,每个应用必须指定path属性(对应应用上下文路径),如果应用指定了attributeNamespace属性,则用attributeNamespace对应的值来限定应用私有的会话数据名称,每个app的attributeNamespace属性只有在CrossDomain上指定了shareSessionAttrs属性才有意义 path:共享session的应用上下文名称 attributeNamespace:应用私有session属性名称命名空间,用来限定应用私有session数据的存储空间 ,如果指定了shareSessionAttrs则必须指定每个应用的attributeNamespace currentApp: 标识应用是所有应用中的当前应用,true 是,false 否,每个应用中应该把自己对于的应用的currentApp属性设置为true,将其他应用的currentApp设置为false。 样例配置说明:假设有以下三个应用,访问地址分别为 http://pdp.bboss.com.cn:8080/PDP http://g4.bboss.com.cn:169/g4studio http://test.bboss.com.cn:8080/WebRoot 通过样例配置,三个应用的用户会话信息存储在session的CREDENTIAL_INDEXS,PRINCIPAL_INDEXS两个共享属性中,可以实现三个应用之间的会话共享和单点登录功能。如果需要共享更多的会话数据,可以将对应的属性追加到shareSessionAttrs中(以逗号分割),没有出现在shareSessionAttrs中的属性都是私有会话数据(对其他应用不可见)。如果没有指定shareSessionAttrs,则会话数据全部在三个应用间共享。 6.mongodb客户端配置 令牌存储mongodb服务器连接配置文件: /bboss-security/resources/mongodb.xml 根据mongodb的部署模式有两种配置方式:集群模式和单机模式 集群配置文件: <properties> <!-- 增加mongodb数据源配置和client工厂类 --> <property name="default" factory-class="org.frameworkset.nosql.mongodb.MongoDB" init-method="init" destroy-method="close" factory-method="getMongoClient"> <property name="serverAddresses" > 10.0.15.134:27017 10.0.15.134:27018 10.0.15.38:27017 10.0.15.39:27017 </property> <property name="option" > QUERYOPTION_SLAVEOK </property> <property name="writeConcern" value="JOURNAL_SAFE"/> <property name="readPreference" value="NEAREST"/> </property> </properties> mongodb主从集群环境下,如果开启了从节点读数据模式(也就是读写分离模式),这里配置了开启模式: <property name="option" > QUERYOPTION_SLAVEOK </property> 这样需要规避主从节点数据复制延迟导致数据不一致的问题,规避方法如下: <property name="writeConcern" value="REPLICA_ACKNOWLEDGED(4,2000)"/> 我们将writeConcern设置为REPLICA_ACKNOWLEDGED(4,2000),只是在4个mongodb节点的数据复制完成确认后,写操作才返回,同时指定了等待2秒超时时间。我们这里是4个节点,可以根据实际情况mongodb节点数设置这个数字,总之不能超过mongodb节点数,但是可以少于节点数。 单mongodb服务器配置: <properties> <!-- 增加mongodb数据源配置和client工厂类 --> <property name="default" factory-class="org.frameworkset.nosql.mongodb.MongoDB" init-method="init" destroy-method="close" factory-method="getMongoClient"> <property name="serverAddresses" > 192.168.1.100:27016 </property> <property name="option" ></property> <property name="writeConcern" value="JOURNAL_SAFE"/> <property name="readPreference" value=""/> </property> </properties> 如果mongodb客户端需要认证登陆,则可以在配置文件中增加认证相关的配置: <properties> <!-- 增加mongodb数据源配置和client工厂类 --> <property name="default" factory-class="org.frameworkset.nosql.mongodb.MongoDB" init-method="init" destroy-method="close" factory-method="getMongoClient"> <property name="serverAddresses" > 192.168.1.100:27016 </property> <property name="option" ></property> <property name="writeConcern" value="JOURNAL_SAFE"/> <property name="readPreference" value=""/> <!-- 如果需要用户认证则在下面配置mongodb的数据库验证用户和口令以及机制 --> <!-- mechanism 取值范围:PLAIN GSSAPI MONGODB-CR MONGODB-X509,默认为MONGODB-CR --> <property name="credentials"> <list componentType="bean"> <property class="org.frameworkset.nosql.mongodb.ClientMongoCredential" f:mechanism="MONGODB-CR" f:database="sessiondb" f:userName="bboss" f:password="bboss"/> <property class="org.frameworkset.nosql.mongodb.ClientMongoCredential" f:mechanism="MONGODB-CR" f:database="tokendb" f:userName="bboss" f:password="bboss"/> </list> </property> </property> </properties> mongodb单机和集群配置认证方法是一样的。 7.bboss会话管理机制与容器管理机制切换 bboss会话管理兼容容器会话管理机制,bboss会话管理会话管理机制与容器管理机制可以进行切换,切换方法非常简单,只需修改sessionstore属性即可: 启用bboss会话共享机制: <property name="sessionstore" refid="attr:sessionstore"/> 关闭bboss会话共享机制并启用容器会话共享机制: <property name="sessionstore" value="session"/> 8.使用session会话共享注意事项 a. bboss会话共享不需要session粘捻机制,所以可以使用诸如haproxy,lvs的3,4层负载机制来实现应用系统的负责均衡功能。 b. 确保共享会话应用部署服务器之间的时钟保持同步一致 c. 在监控中心统一销毁所有失效session,解放应用管理失效session的职责 d. 应用必须设置为管理本应用的会话数据,只能在监控中心管理所有应用的会话数据 e. session中对象的序列化采用bboss自带的序列化框架,如果碰到对象无法序列化问题,可以通过bboss自定义序列化插件定义特定的序列化插件来实现这些对象的序列化。具体序列化介绍请参看文档: bboss自定义类对象序列化机制介绍 bboss序列化功能介绍 9.遗留系统集成会话共享组件哪些情况下需要进行程序调整 遗留系统集成会话共享组件哪些情况下需要进行程序调整呢,下面列举了最常见的几种情况: a).遗留系统修改存储在session中数据对象的属性和状态,但是没有重新set到session中 修改:调用session.setAttribute方法将修改后的对象再次存储到mongodb中的session表中,以便将修改共享给其他域应用或者集群应用节点。 b). 遗留系统存储在session中的对象数据无法采用bboss进行序列化或者反序列化 修改:调整对象定义或者为对象编写序列化插件,采取哪种方式视实际情况来定 c).遗留系统定义并使用Session Event Listener,bboss提供了特有的session监听器 修改:需要将原来的session监听器迁移到bboss规范的session监听器 d.)遗留系统使用了重量级的session数据对象(对象中引用了很多大对象,这些大对象彼此没有关联,如果只需要获取或者修改其中的一部分数据,每次都要完整地将从mongodb中获取/写入这个完整的大对象,导致IO和性能低下) 修改:将这些彼此独立的数据从大对象中剥离出来,作为独立属性存储到session中,从而避免不必要的开销。 总体来说bboss的会话共享机制非常简单实用和高效。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2014-05-13
呵呵,好轮子,后面有空搞个redis的
|
|
返回顶楼 | |
发表时间:2014-05-27
bboss会话共享不需要session粘捻机制,所以可以使用诸如haproxy,lvs的3,4层负载机制来实现应用系统的负责均衡功能。
session中对象的序列化采用bboss自带的序列化框架,如果碰到对象无法序列化问题,可以通过bboss自定义序列化插件定义特定的序列化插件来实现这些对象的序列化。具体序列化介绍请参看文档: bboss自定义类对象序列化机制介绍 bboss序列化功能介绍 |
|
返回顶楼 | |
发表时间:2014-05-28
bboss会话共享组件特点如下:
a.基于bboss框架开发,快速与在线应用系统集成,配置简单 b.容器无关性,适用于业界所以主流应用服务器(tomcat,jetty,weblogic,websphere等) c.无需session sticking,应用集群可以根据实际需要使用haproxy,lvs的3,4,7层负载机制 d.session存储采用mongodb(支持mongodb集群和单机模式) e.session属性读取和存入采用增量操作模式,而不是整体保存和读取整个session数据,在应用端采用一级缓存存储session数据并避免session脏数据,性能高效。 f.共享sesion数据存储和读取直接采用bboss序列化模块进行序列化,高效简洁,bboss序列化机制对数据没有特定要求,一般都可以进行序列化(万一碰到不能序列化的情况,也无需调整遗留应用程序,可以通过自定义扩展bboss序列化插件来完成这些数据的序列化)。 |
|
返回顶楼 | |
发表时间:2014-07-01
|
|
返回顶楼 | |