- 浏览: 697655 次
- 性别:
- 来自: 长沙
文章分类
- 全部博客 (364)
- quick start (57)
- bboss aop (43)
- bboss mvc (48)
- bboss persistent (96)
- bboss taglib (30)
- bboss event (10)
- bbossgroups (52)
- bboss (32)
- bboss会话共享 (17)
- bboss rpc (7)
- bboss 国际化 (5)
- bboss 序列化 (9)
- bboss cxf webservice (8)
- bboss hessian (3)
- bboss 安全认证SSO (15)
- bboss 工作流 (6)
- 平台 (18)
- bboss quartz (3)
- 杂谈 (5)
- 大数据 (1)
- bboss elastic (24)
- bboss http (1)
- bboss kafka (1)
- Elasticsearch Scroll和Slice Scroll查询API使用案例 (1)
最新评论
-
qianhao123:
...
采用gradle构建和发布bboss方法介绍 -
qianhao123:
[img][/img]
采用gradle构建和发布bboss方法介绍 -
yin_bp:
欢迎大家参与working
高性能elasticsearch ORM开发库使用介绍 -
qq641879434:
万分感谢
bboss 持久层sql xml配置文件编写和加载方法介绍 -
yin_bp:
qq641879434 写道怎么设置配置文件 可以查看执行的S ...
bboss 持久层sql xml配置文件编写和加载方法介绍
bboss session共享使用方法介绍。
本文介绍如何配置bboss session的及主要参数含义说明,具体的集成到应用系统的方法可以参考文档:bboss session集成权威指南
1.会话共享github地址
https://github.com/bbossgroups/security
下载下来包含3个子模块的gradle工程:
bboss-secutiry 会话共享核心工程(包含令牌功能)
bboss-security-web 会话共享监控工程(包含令牌功能和令牌hessian和webservice、http服务)
bboss-ticket sso工程
会话共享demo 地址
https://github.com/bbossgroups/sessiondemo
session 基本会话共享demo(不包含监控功能)
sessionmonitor 包含监控功能的会话共享demo
将这些工程通过eclipse gradle sts插件导入eclipse即可,导入方法参考:
bboss gradle工程导入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.SessionCharsetEncodingFilter,SessionCharsetEncodingFilter是bboss session过滤器组件的子类:
org.frameworkset.security.session.impl.SessionFilter
应用系统也可以直接使用org.frameworkset.security.session.impl.SessionFilter作为session共享拦截器使用。
只有符合filter-mapping对应规则的url请求,session才会具有会话共享功能。
5.会话共享组件配置
集群应用会话共享模式
配置文件路径:/resources/sessionconf.xml,sessionconf.xml文件只要编译到classes的跟目录下即可
sessionManager配置说明: org.frameworkset.security.session.impl.SessionManager是bboss提供的session会话管理组件。
sessionTimeout-属性指定会话超时时间,单位:毫秒,-1或0标识session永不超时。
sessionstore-指定session的存储机制,session表示会话使用容器默认的会话管理机制,配置为MongDBSessionStore时则启用bboss的会话管理机制
cookiename-指定会话cookie名称,为了避免同根域应用之间session id冲突,必须为这些同根域的应用指定不同cookiename;但是如果需要做跨域跨应用会话共享的情况下,这些子域名不同的应用(或者域名相同上下文不同的应用)的必须指定相同cookiename,否则无法实现跨域跨应用会话共享。
enableSessionIDFromParameter-从请求参数中获取sessionid控制开关
true 启用,使用cookiename属性对应的值作为传递sessionid的参数名称
false 关闭 默认值
优先从cookie中获取sessionid,如果从cookie中没有获取sessionid到才需要从参数中获取sessionid
httpOnly-指定会话cookie是否使用httponly模式,true和false两个值,默认为true
secure –结合https阻止传输过程中sessionid被窃取
monitorAttributes 配置监控查询模块中可以作为查询条件的session属性清单,采用json数组进行配置,具体配置和使用方法参考文档:
http://yin-bp.iteye.com/blog/2265855
appcode-应用编码,如果没有指定appcode值默认为应用上下文
appcode的作用:当所有的应用上下文为“/”时,
用来区分后台统计的会话信息, 如果应用上下文为“/”时,appcode为ROOT
sessionlisteners-指定session监听器,多个listener可以按照顺序以逗号分隔填入即可,listener只有在bboss管理会话的时候才有用,每一个listener必须实现接口:
startLifeScan-是否在当前应用中启用失效会话扫描机制,true启用,false不启用,默认为false,一般所有连接到同一mongodb的应用在本地都会关闭失效会话扫描机制,而统一由独立的失效会话扫描服务应用(开启扫描机制)来负责失效会话扫描和销毁失效会话,这样可以提升应用性能。
sessionscaninterval-指定失效session销毁线程扫描频率 ,单位:毫秒,默认1小时。
lazystore:延迟存储修改的session数据到mongodb的控制开关,true表示当请求结束前一次性将request过程中所有通过session.setAttribute(key,value)方法对session数据的修改存储到会话共享平台中,提升性能,否则每次都实时将修改存储到mongodb中,默认为false
sessionIDGenerator:指定session id生成机制,默认为UUID,应用可以参考文档《bboss session自定义session id生成机制介绍 》自定义session id生成机制
serialType:指定session数据序列化机制,三种机制:bboss,json,jvm;默认采用bboss序列化机制;jvm机制需要对象实现java.io.Serializable接口;json机制,json适用于没有复杂对象引用关系的应用系统session数据的序列化,因此json序列化机制适用范围有限。
storeReadAttributes:布尔值,当lazystore为true时起作用,storeReadAttributes为true时,提交session数据到后台存储(mongodb或者redis)时,同时将之前获取到的session属性也一并更新到后台,否则不更新。这个属性在整合bboss session框架到遗留系统中比较有用,单体应用系统中,修改session中存储的对象属性时,由于引用关系的原因,无需将最新的对象重新set到session中,但是集群应用系统中,如果不重新set到session中(持久化到redis或者mongodb中),最新的对象状态不会被其他应用看到,所以为了让其他节点看到最新的修改,必须将修改的对象重新放置到session中,势必需要修改遗留系统的程序才能实现,但是通过将lazystore设置为true并且将storeReadAttributes也设置为true,就可以自动将读取到数据也强制在提交时设置到session中,这样就无需调整遗留系统的程序了。
sessionstore用来指定session的存储组件实现类,目前只提供了mongodb和redis两种存储机制:
org.frameworkset.security.session.impl.MongDBSessionStore
rg.frameworkset.security.session.impl.RedisSessionStore
通过插件扩展机制,可以采用redis来存储会话对象。redis的配置可以参考文档:bboss session redis插件使用指南
sessionStaticManager组件是bboss会话共享组件的监控统计组件:
sessionStaticManager组件的monitorScope属性用来指定监控的应用范围,
self:表示只能监控管理本应用的会话数据(默认值)
all:表示监控管理所有应用的会话数据
出于安全性考虑,接入同一个mongodb的应用系统只能管理和监控本应用的会话数据,monitorScope为self,统一监控中心管理和监控所有应用系统的会话数据,这时monitorScope被指定为all。
管理功能包括会话应用库的删除,批量删除应用会话,清空应用下所有会话,按特定条件查询会话,查看会话详细信息(会话基本信息,会话中存放的属性数据(序列化后的xml串))。会话应用库的删除只能在监控中心进行,而且不能删除监控中心对应的会话应用,这个功能要慎用。
删除会话信息时不会删除管理用户对应的会话对象。
管理界面:
会话共享组件集成到跨域应用配置:
跨域应用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,则会话数据全部在三个应用间共享。
通过传递加密sessionid实现跨域跨应用session共享
如果几个应用没有相同的根域名或者都是通过不同的ip进行访问,那么除了做上面的crossDomain配置,还需要通过传递加密的sessionid来实现他们之间的session共享,具体方法描述如下。
1.首先去掉crossDomain组件的属性 f:domain="xxxx"
2.在每个应用的sessionconf.xml中做以下配置,启用参数方式传递sessionid功能
为sessionManager组件配置以下属性:
3.构建并传递加密的sessionid
从参数传递的sessionid,必须采用以下方式对sessionid进行加密,才能传递,示例代码如下:
6.mongodb客户端配置
会话存储mongodb服务器连接配置文件:
/bboss-security/resources/mongodb.xml
根据mongodb的部署模式有两种配置方式:集群模式和单机模式
集群配置文件:
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服务器配置:
如果mongodb客户端需要认证登陆,则可以在配置文件中增加认证相关的配置:
mongodb单机和集群配置认证方法是一样的。
7.bboss会话管理机制与容器管理机制切换
bboss会话管理兼容容器会话管理机制,bboss会话管理会话管理机制与容器管理机制可以进行切换,切换方法非常简单,只需修改sessionstore属性即可:
启用bboss会话共享机制:
关闭bboss会话共享机制并启用容器会话共享机制:
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表中,以便将修改共享给其他域应用或者集群应用节点。
方案二 修改配置属性,如下:
<property name="lazystore" value="true"/>
<property name="storeReadAttributes" value="true"/>
这样修改了testVO的属性,无需手动设置回session,bboss会在请求结束时强制将复杂对象存储到redis或者mongodb,读取到的基本数据类型(String,数字,日期,Local)不会被强制存储:
b). 遗留系统存储在session中的对象数据无法采用bboss进行序列化或者反序列化
修改:调整对象定义或者为对象编写序列化插件,采取哪种方式视实际情况来定
c).遗留系统定义并使用Session Event Listener,bboss提供了特有的session监听器
修改:需要将原来的session监听器迁移到bboss规范的session监听器
d.)遗留系统使用了重量级的session数据对象(对象中引用了很多大对象,这些大对象彼此没有关联,如果只需要获取或者修改其中的一部分数据,每次都要完整地将从mongodb中获取/写入这个完整的大对象,导致IO和性能低下)
修改:将这些彼此独立的数据从大对象中剥离出来,作为独立属性存储到session中,从而避免不必要的开销。
e.)集成常见问题解决办法
1.无构造函数对象序列化报错问题解决方法
解决方法:为这些类指定jvm原生序列化机制,以spring security框架对象为例:
修改bboss序列化插件文件:resources/org/frameworkset/soa/serialconf.xml,添加内容:
最终的配置文件serialconf.xml内容
注意:其中的magic属性必须在保证全局唯一
Bboss序列化插件定义和配置参考文档:http://yin-bp.iteye.com/blog/2071882
2. hibernate延迟加载容器对象序列化错误问题解决方法
解决方法:升级到最新的bboss框架包和session共享包
3. 404/403/500错误页面没有禁用session,导致bboss session共享失效
解决方法:404/403/500错误页面禁用session,在jsp头部添加session="false"属性
4. sessionFilter拦截的动态请求地址必须涵盖所有需要使用session的动态请求地址,不要遗漏特殊的地址,例如:/
5.session数据序列化过程产生的一些无关紧要的Exception,可以直接忽略掉,参考以下方法设置需要忽略的异常类
指定序列化过程中可以忽略的异常信息,以换行符分割
在bboss 序列化插件配置文件/resources/org/frameworkset/soa/serialconf.xml的ignoreExceptions节点中进行设置:
默认忽略hibernate延迟加载异常:org.hibernate.LazyInitializationException
10.session id cookiename命名约定
会话共享框架采用cookie机制在浏览器端存放session id,为了避免同根域应用之间session id冲突,必须为这些同根域的应用指定不同cookiename;但是如果需要做跨域跨应用会话共享的情况下,这些子域名不同的应用(或者域名相同上下文不同的应用)的必须指定相同cookiename,否则无法实现跨域跨应用会话共享。
总体来说bboss的会话共享机制非常简单实用和高效。
楼下的g4studio好像就是基于spring mvc开发的,成功地整合了bboss session管理功能。
另外在下文中介绍了两个bboss session管理模块的demo(一个纯净的session管理,一个带监控的demo),参考这两个demo就可以将bboss session管理模块集成到你的应用系统中
http://yin-bp.iteye.com/blog/2087308
可以整合的,不过需要引入bboss的几个包和配置
ok
从你给出的情形2报文可以看出一个问题:bboss序列化插件目前只对一般po对象有作用,对map和list对象不起作用,这个我会整改掉 。
反序列化有错误日志吗,发出来看看
从你配置的两种情形来看,序列化产生的xml文档都是没有问题的,主要是反序列化时出来的对象有问题或者直接报错了,所以需要跟踪一下反序列化出来的对象状态或者错误信息。
反序列化程序没有报异常,只是返回的对象为null。
从你给出的情形2报文可以看出一个问题:bboss序列化插件目前只对一般po对象有作用,对map和list对象不起作用,这个我会整改掉 。
反序列化有错误日志吗,发出来看看
从你配置的两种情形来看,序列化产生的xml文档都是没有问题的,主要是反序列化时出来的对象有问题或者直接报错了,所以需要跟踪一下反序列化出来的对象状态或者错误信息。
从你给出的情形2报文可以看出一个问题:bboss序列化插件目前只对一般po对象有作用,对map和list对象不起作用,这个我会整改掉 。
反序列化有错误日志吗,发出来看看
如有问题记得反馈给我
本文介绍如何配置bboss session的及主要参数含义说明,具体的集成到应用系统的方法可以参考文档:bboss session集成权威指南
1.会话共享github地址
https://github.com/bbossgroups/security
下载下来包含3个子模块的gradle工程:
bboss-secutiry 会话共享核心工程(包含令牌功能)
bboss-security-web 会话共享监控工程(包含令牌功能和令牌hessian和webservice、http服务)
bboss-ticket sso工程
会话共享demo 地址
https://github.com/bbossgroups/sessiondemo
session 基本会话共享demo(不包含监控功能)
sessionmonitor 包含监控功能的会话共享demo
将这些工程通过eclipse gradle sts插件导入eclipse即可,导入方法参考:
bboss gradle工程导入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.SessionCharsetEncodingFilter,SessionCharsetEncodingFilter是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"/> <!-- enableSessionIDFromParameter:支持以参数方式 传递sessionid控制开关 true 启用,使用cookiename属性对应的值作为传递sessionid的参数名称 false 关闭 默认值 优先从cookie中获取sessionid,如果从cookie中没有获取sessionid到才需要从参数中获取sessionid 从参数传递的sessionid,必须采用以下方式对sessionid进行加密,才能传递: String sid = SessionUtil.getSessionManager().getSignSessionIDGenerator().sign(session.getId(), true); String url = "http://otherappurl?"+SessionUtil.getSessionManager().getCookiename()+"="+sid --> <property name="enableSessionIDFromParameter" value="false"/> <!-- 将从请求参数中获取sessionid写回cookie控制开关,当enableSessionIDFromParameter为true时起作用<br> true 启用,使用cookiename属性将对应的值作为sessionid写回cookie<br> false 关闭 默认值<br> bboss采用增强的sessionid签名校验机制,避免客户端篡改sessionid,为了避免bboss内置的sessionid的签名算法被暴露,请修改默认的signKey --> <property name="rewriteSessionCookie" value="false"/> <!-- 是否对sessionid进行加密存入cookie true 加密 false 不加密,默认值 --> <property name="signSessionID" value="false"/> <!-- sessionid 签名key,signSessionID为true时起作用 --> <property name="signKey" value="bboss_session"/> <property name="httpOnly" value="true"/> <property name="secure" value="false"/> <property name="lazystore" value="true"/> <property name="storeReadAttributes" value="false"/> <property name="serialType" value="bboss"/> <property name="sessionIDGenerator" class="org.frameworkset.security.session.impl.UUIDSessionIDGenerator"/> <property name="monitorAttributes" ><![CDATA[ [ {"name":"userAccount","cname":"账号","type":"String","like":true,"enableEmptyValue":false}, {"name":"worknumber","cname":"工号","type":"String","like":false,"enableEmptyValue":true} ] ]]></property> <!-- <property name="sessionlisteners" value="org.frameworkset.security.session.impl.NullSessionListener"/> --> <!-- 指定失效session销毁线程扫描频率 ,单位:毫秒--> <property name="sessionscaninterval" value="3600000"/> <!-- 失效session销毁线程开启开关:true 开启, false 关闭 --> <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名称,为了避免同根域应用之间session id冲突,必须为这些同根域的应用指定不同cookiename;但是如果需要做跨域跨应用会话共享的情况下,这些子域名不同的应用(或者域名相同上下文不同的应用)的必须指定相同cookiename,否则无法实现跨域跨应用会话共享。
enableSessionIDFromParameter-从请求参数中获取sessionid控制开关
true 启用,使用cookiename属性对应的值作为传递sessionid的参数名称
false 关闭 默认值
优先从cookie中获取sessionid,如果从cookie中没有获取sessionid到才需要从参数中获取sessionid
httpOnly-指定会话cookie是否使用httponly模式,true和false两个值,默认为true
secure –结合https阻止传输过程中sessionid被窃取
monitorAttributes 配置监控查询模块中可以作为查询条件的session属性清单,采用json数组进行配置,具体配置和使用方法参考文档:
http://yin-bp.iteye.com/blog/2265855
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的应用在本地都会关闭失效会话扫描机制,而统一由独立的失效会话扫描服务应用(开启扫描机制)来负责失效会话扫描和销毁失效会话,这样可以提升应用性能。
sessionscaninterval-指定失效session销毁线程扫描频率 ,单位:毫秒,默认1小时。
lazystore:延迟存储修改的session数据到mongodb的控制开关,true表示当请求结束前一次性将request过程中所有通过session.setAttribute(key,value)方法对session数据的修改存储到会话共享平台中,提升性能,否则每次都实时将修改存储到mongodb中,默认为false
sessionIDGenerator:指定session id生成机制,默认为UUID,应用可以参考文档《bboss session自定义session id生成机制介绍 》自定义session id生成机制
serialType:指定session数据序列化机制,三种机制:bboss,json,jvm;默认采用bboss序列化机制;jvm机制需要对象实现java.io.Serializable接口;json机制,json适用于没有复杂对象引用关系的应用系统session数据的序列化,因此json序列化机制适用范围有限。
storeReadAttributes:布尔值,当lazystore为true时起作用,storeReadAttributes为true时,提交session数据到后台存储(mongodb或者redis)时,同时将之前获取到的session属性也一并更新到后台,否则不更新。这个属性在整合bboss session框架到遗留系统中比较有用,单体应用系统中,修改session中存储的对象属性时,由于引用关系的原因,无需将最新的对象重新set到session中,但是集群应用系统中,如果不重新set到session中(持久化到redis或者mongodb中),最新的对象状态不会被其他应用看到,所以为了让其他节点看到最新的修改,必须将修改的对象重新放置到session中,势必需要修改遗留系统的程序才能实现,但是通过将lazystore设置为true并且将storeReadAttributes也设置为true,就可以自动将读取到数据也强制在提交时设置到session中,这样就无需调整遗留系统的程序了。
sessionstore用来指定session的存储组件实现类,目前只提供了mongodb和redis两种存储机制:
org.frameworkset.security.session.impl.MongDBSessionStore
rg.frameworkset.security.session.impl.RedisSessionStore
通过插件扩展机制,可以采用redis来存储会话对象。redis的配置可以参考文档:bboss session redis插件使用指南
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"/> <property name="monitorAttributes" ><![CDATA[ [ {"name":"userAccount","cname":"账号","type":"String","like":true,"enableEmptyValue":false}, {"name":"worknumber","cname":"工号","type":"String","like":false,"enableEmptyValue":true} ] ]]></property> <!-- 应用编码,如果没有指定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,则会话数据全部在三个应用间共享。
通过传递加密sessionid实现跨域跨应用session共享
如果几个应用没有相同的根域名或者都是通过不同的ip进行访问,那么除了做上面的crossDomain配置,还需要通过传递加密的sessionid来实现他们之间的session共享,具体方法描述如下。
1.首先去掉crossDomain组件的属性 f:domain="xxxx"
2.在每个应用的sessionconf.xml中做以下配置,启用参数方式传递sessionid功能
为sessionManager组件配置以下属性:
<!-- enableSessionIDFromParameter:支持以参数方式 传递sessionid控制开关 true 启用,使用cookiename属性对应的值作为传递sessionid的参数名称 false 关闭 默认值 优先从cookie中获取sessionid,如果从cookie中没有获取sessionid到才需要从参数中获取sessionid 从参数传递的sessionid,必须采用以下方式对sessionid进行加密,才能传递: String sid = SessionUtil.getSessionManager().getSignSessionIDGenerator().sign(session.getId(), true); String url = "http://otherappurl?"+SessionUtil.getSessionManager().getCookiename()+"="+sid --> <property name="enableSessionIDFromParameter" value="true"/> <!-- 将从请求参数中获取sessionid写回cookie控制开关,当enableSessionIDFromParameter为true时起作用<br> true 启用,使用cookiename属性将对应的值作为sessionid写回cookie<br> false 关闭 默认值<br> bboss采用增强的sessionid签名校验机制,避免客户端篡改sessionid,为了避免bboss内置的sessionid的签名算法被暴露,请修改默认的signKey --> <property name="rewriteSessionCookie" value="true"/> <!-- 是否对sessionid进行加密存入cookie true 加密 false 不加密,默认值 --> <property name="signSessionID" value="false"/> <!-- sessionid 签名key,signSessionID为true时起作用 --> <property name="signKey" value="bboss_session"/>
3.构建并传递加密的sessionid
从参数传递的sessionid,必须采用以下方式对sessionid进行加密,才能传递,示例代码如下:
String sid = SessionUtil.getSessionManager().getSignSessionIDGenerator().sign(session.getId(), true); //加密sessionid String url = "http://otherappurl?"+SessionUtil.getSessionManager().getCookiename()+"="+sid ; //传递sessionid
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节点数,但是可以少于节点数。
完全的读写分离配置:
<property name="default" factory-class="org.frameworkset.nosql.mongodb.MongoDB" init-method="init" destroy-method="close" factory-method="getMongoClient"> <!-- 这里不需要配置destroy-method,因为bboss持久层在jvm退出时会自动调用数据源的close方法 --> <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="REPLICA_ACKNOWLEDGED(4,2000)"/> <property name="readPreference" value="SECONDARY_PREFERRED"/> <property name="autoConnectRetry" value="true"/> <property name="connectionsPerHost" value="10"/> <property name="maxWaitTime" value="120000"/> <property name="socketTimeout" value="0"/> <property name="connectTimeout" value="15000"/> <property name="threadsAllowedToBlockForConnectionMultiplier" value="5"/> <property name="socketKeepAlive" value="true"/> <!-- 如果需要用户认证则在下面配置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>
单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表中,以便将修改共享给其他域应用或者集群应用节点。
TestVO testVO = (TestVO)session.getAttribute("testVO"); //修改testVO中属性的值 testVO.setId("testvoidaaaaa,sessionmonitor modifiy id"); //需要将修改后的对象重新设置到session中否则无法存储最新的testVO到mongodb中 session.setAttribute("testVO", testVO);
方案二 修改配置属性,如下:
<property name="lazystore" value="true"/>
<property name="storeReadAttributes" value="true"/>
这样修改了testVO的属性,无需手动设置回session,bboss会在请求结束时强制将复杂对象存储到redis或者mongodb,读取到的基本数据类型(String,数字,日期,Local)不会被强制存储:
TestVO testVO = (TestVO)session.getAttribute("testVO"); //修改testVO中属性的值 testVO.setId("testvoidaaaaa,sessionmonitor modifiy id");
b). 遗留系统存储在session中的对象数据无法采用bboss进行序列化或者反序列化
修改:调整对象定义或者为对象编写序列化插件,采取哪种方式视实际情况来定
c).遗留系统定义并使用Session Event Listener,bboss提供了特有的session监听器
修改:需要将原来的session监听器迁移到bboss规范的session监听器
d.)遗留系统使用了重量级的session数据对象(对象中引用了很多大对象,这些大对象彼此没有关联,如果只需要获取或者修改其中的一部分数据,每次都要完整地将从mongodb中获取/写入这个完整的大对象,导致IO和性能低下)
修改:将这些彼此独立的数据从大对象中剥离出来,作为独立属性存储到session中,从而避免不必要的开销。
e.)集成常见问题解决办法
1.无构造函数对象序列化报错问题解决方法
Caused by: java.lang.NoSuchMethodException: org.springframework.security.web.savedrequest.DefaultSavedRequest do not define a default construction.
解决方法:为这些类指定jvm原生序列化机制,以spring security框架对象为例:
org.springframework.security.providers.UsernamePasswordAuthenticationToken
修改bboss序列化插件文件:resources/org/frameworkset/soa/serialconf.xml,添加内容:
<property name="org.springframework.security.providers.UsernamePasswordAuthenticationToken" magic="3"serial="org.frameworkset.soa.JDKSerial"/>
最终的配置文件serialconf.xml内容
<properties> <property name="java.util.Locale" magic="1" serial="org.frameworkset.soa.LocaleSerial"/> <property name="net.sf.jasperreports.engine.JasperPrint" magic="2" serial="org.frameworkset.soa.JDKSerial"/> <property name="org.springframework.security.providers.UsernamePasswordAuthenticationToken" magic="3" serial="org.frameworkset.soa.JDKSerial"/> </properties>
注意:其中的magic属性必须在保证全局唯一
Bboss序列化插件定义和配置参考文档:http://yin-bp.iteye.com/blog/2071882
2. hibernate延迟加载容器对象序列化错误问题解决方法
解决方法:升级到最新的bboss框架包和session共享包
3. 404/403/500错误页面没有禁用session,导致bboss session共享失效
解决方法:404/403/500错误页面禁用session,在jsp头部添加session="false"属性
<%@ page session="false" language="java" contentType="text/html; charset=UTF-8"%>
4. sessionFilter拦截的动态请求地址必须涵盖所有需要使用session的动态请求地址,不要遗漏特殊的地址,例如:/
5.session数据序列化过程产生的一些无关紧要的Exception,可以直接忽略掉,参考以下方法设置需要忽略的异常类
指定序列化过程中可以忽略的异常信息,以换行符分割
在bboss 序列化插件配置文件/resources/org/frameworkset/soa/serialconf.xml的ignoreExceptions节点中进行设置:
<property name="ignoreExceptions"> <![CDATA[ org.frameworkset.soa.IgnoreException1 org.frameworkset.soa.IgnoreException2 ]]> </property>
默认忽略hibernate延迟加载异常:org.hibernate.LazyInitializationException
10.session id cookiename命名约定
会话共享框架采用cookie机制在浏览器端存放session id,为了避免同根域应用之间session id冲突,必须为这些同根域的应用指定不同cookiename;但是如果需要做跨域跨应用会话共享的情况下,这些子域名不同的应用(或者域名相同上下文不同的应用)的必须指定相同cookiename,否则无法实现跨域跨应用会话共享。
总体来说bboss的会话共享机制非常简单实用和高效。
评论
27 楼
yin_bp
2015-09-24
tengyizu 写道
请问这个支持spring mvc 整合吗?
楼下的g4studio好像就是基于spring mvc开发的,成功地整合了bboss session管理功能。
另外在下文中介绍了两个bboss session管理模块的demo(一个纯净的session管理,一个带监控的demo),参考这两个demo就可以将bboss session管理模块集成到你的应用系统中
http://yin-bp.iteye.com/blog/2087308
26 楼
yin_bp
2015-09-24
tengyizu 写道
请问这个支持spring mvc 整合吗?
可以整合的,不过需要引入bboss的几个包和配置
25 楼
tengyizu
2015-09-24
请问这个支持spring mvc 整合吗?
24 楼
yin_bp
2015-07-28
mongodb版本目前支持2.6.3
23 楼
way2012
2014-12-22
session 共享 mark
22 楼
yin_bp
2014-07-17
解决了g4studio中会话共享时序列化java.util.ArrayList$SubList失败问题,修改后的版本可以从以下地址下载:
https://github.com/yin-bp/g4studio
https://github.com/yin-bp/g4studio
21 楼
yin_bp
2014-07-11
花了近1个小时搭建g4studio开发环境、整合bboss会话共享框架并调整部分g4studio源码程序,终于在g4studio中搞定会话共享功能
至于sarkara测试过程中碰到的问题并不是序列化导致的,具体原因跟我之前回复中提到的内容有关:
开启会话共享机制后,如果修改了sessionContainer中的数据,需要将修改后的sessionContainer对象重新设置到session中,否则无法将最新的sessionContainer存储到mongodb中
以下是问题分析和解决过程:
g4studio对session的操作不是很规范,登录时,先创建一个sessionContainer对象,然后把这个空的对象设置到共享session中,再完成登录操作,得到一个UserInfoVo对象并将UserInfoVo对象设置到sessionContainer对象中,然后登录就结束了;这个做法在非session共享情况下是没有问题的,但是在session共享情况下就有问题了,最后必须将sessionContainer重新设置到共享session对象中,针对sessionContainer的修改才会生效
另外,g4studio登录到首页后有个选择主题的功能,其中也会修改sessionContainer中UserInfoVo对象的一个layout属性,这里也需要重新设置sessionContainer对象到session中;还有g4studio种将一些报表对象也设置到sessionContainer中,每次设置后也需要将sessionContainer重新设置到共享session对象中。由此可以看出sessionContainer是一个非常重量级的session数据对象,建议g4studio 的作者将一些报表对象单独设置到session中,从sessionContainer中剥离出来,这样可以避免每次将一些无关的报表对象重新写入mongodb中。
我已经将所有的修改以及集成了bboss会话共享的commit给g4studio作者,看看作者是否愿意将这个commit合并到g4studio master主干版本中。
修改的版本可以从以下地址下载:
https://github.com/yin-bp/g4studio
对g4studio详细修改说明参考地址:
https://github.com/yin-bp/g4studio/commit/d7f802f8f48c05e096ebde4cf1a878217cddd7e7
至于sarkara测试过程中碰到的问题并不是序列化导致的,具体原因跟我之前回复中提到的内容有关:
开启会话共享机制后,如果修改了sessionContainer中的数据,需要将修改后的sessionContainer对象重新设置到session中,否则无法将最新的sessionContainer存储到mongodb中
以下是问题分析和解决过程:
g4studio对session的操作不是很规范,登录时,先创建一个sessionContainer对象,然后把这个空的对象设置到共享session中,再完成登录操作,得到一个UserInfoVo对象并将UserInfoVo对象设置到sessionContainer对象中,然后登录就结束了;这个做法在非session共享情况下是没有问题的,但是在session共享情况下就有问题了,最后必须将sessionContainer重新设置到共享session对象中,针对sessionContainer的修改才会生效
另外,g4studio登录到首页后有个选择主题的功能,其中也会修改sessionContainer中UserInfoVo对象的一个layout属性,这里也需要重新设置sessionContainer对象到session中;还有g4studio种将一些报表对象也设置到sessionContainer中,每次设置后也需要将sessionContainer重新设置到共享session对象中。由此可以看出sessionContainer是一个非常重量级的session数据对象,建议g4studio 的作者将一些报表对象单独设置到session中,从sessionContainer中剥离出来,这样可以避免每次将一些无关的报表对象重新写入mongodb中。
我已经将所有的修改以及集成了bboss会话共享的commit给g4studio作者,看看作者是否愿意将这个commit合并到g4studio master主干版本中。
修改的版本可以从以下地址下载:
https://github.com/yin-bp/g4studio
对g4studio详细修改说明参考地址:
https://github.com/yin-bp/g4studio/commit/d7f802f8f48c05e096ebde4cf1a878217cddd7e7
20 楼
yin_bp
2014-07-11
sarkara 写道
yin_bp 写道
好的,我有空搭个环境调试一下,搭环境不复杂吧
挑这个来测试就是因为搭建比较方便。1.导入一下项目;2.建数据库,改数据链接;3.运行他的org.StartUp,里面用了jetty做内置服务器。ok
19 楼
sarkara
2014-07-11
yin_bp 写道
好的,我有空搭个环境调试一下,搭环境不复杂吧
挑这个来测试就是因为搭建比较方便。1.导入一下项目;2.建数据库,改数据链接;3.运行他的org.StartUp,里面用了jetty做内置服务器。
18 楼
yin_bp
2014-07-11
好的,我有空搭个环境调试一下,搭环境不复杂吧
17 楼
sarkara
2014-07-11
yin_bp 写道
yin_bp 写道
sarkara 写道
.....
从你给出的情形2报文可以看出一个问题:bboss序列化插件目前只对一般po对象有作用,对map和list对象不起作用,这个我会整改掉 。
反序列化有错误日志吗,发出来看看
从你配置的两种情形来看,序列化产生的xml文档都是没有问题的,主要是反序列化时出来的对象有问题或者直接报错了,所以需要跟踪一下反序列化出来的对象状态或者错误信息。
反序列化程序没有报异常,只是返回的对象为null。
16 楼
yin_bp
2014-07-11
yin_bp 写道
sarkara 写道
.....
从你给出的情形2报文可以看出一个问题:bboss序列化插件目前只对一般po对象有作用,对map和list对象不起作用,这个我会整改掉 。
反序列化有错误日志吗,发出来看看
从你配置的两种情形来看,序列化产生的xml文档都是没有问题的,主要是反序列化时出来的对象有问题或者直接报错了,所以需要跟踪一下反序列化出来的对象状态或者错误信息。
15 楼
yin_bp
2014-07-11
sarkara 写道
.....
从你给出的情形2报文可以看出一个问题:bboss序列化插件目前只对一般po对象有作用,对map和list对象不起作用,这个我会整改掉 。
反序列化有错误日志吗,发出来看看
14 楼
sarkara
2014-07-11
按照您的建议,使用JDKSerial,还是无法正确序列化和反序列化。
情形1:配置
序列化结果:
情形2:配置
序列化结果:
请帮忙看看是什么问题。
情形1:配置
<property name="org.g4studio.system.common.dao.vo.UserInfoVo" magic="3" serial="org.frameworkset.soa.JDKSerial"/> <property name="org.g4studio.core.web.report.jasper.ReportData" magic="4" serial="org.frameworkset.soa.JDKSerial"/> <property name="org.g4studio.core.metatype.impl.BaseDto" magic="5" serial="org.frameworkset.soa.JDKSerial"/> <property name="org.g4studio.common.util.SessionContainer" magic="6" serial="org.frameworkset.soa.JDKSerial"/>
序列化结果:
/* 0 */ { "_id" : ObjectId("53bf341b26239a62f6f994a6"), "sessionid" : "3af1a128-95d3-413c-bb27-d311d8b86236", "creationTime" : NumberLong("1405039643027"), "maxInactiveInterval" : NumberLong(3600000), "lastAccessedTime" : NumberLong("1405039648191"), "_validate" : true, "appKey" : "g4studio", "referip" : "0:0:0:0:0:0:0:1", "host" : "172.168.8.101-tt-nn", "requesturi" : "/g4studio/login.do", "lastAccessedUrl" : "/g4studio/login.do", "httpOnly" : false, "secure" : false, "lastAccessedHostIP" : "172.168.8.101-tt-nn", "SessionContainer" : "<ps><p n=\"_dflt_\" mg=\"6\"><![CDATA[rO0ABXNyAClvcmcuZzRzdHVkaW8uY29tbW9uLnV0aWwuU2Vzc2lvbkNvbnRhaW5lcoi7oSBJ6bIH\r\nAgACTAAJcmVwb3J0RHRvdAAgTG9yZy9nNHN0dWRpby9jb3JlL21ldGF0eXBlL0R0bztMAAh1c2Vy\r\nSW5mb3QALkxvcmcvZzRzdHVkaW8vc3lzdGVtL2NvbW1vbi9kYW8vdm8vVXNlckluZm9Wbzt4cHNy\r\nACdvcmcuZzRzdHVkaW8uY29yZS5tZXRhdHlwZS5pbXBsLkJhc2VEdG/gnx8WlROksgIAAHhyABFq\r\nYXZhLnV0aWwuSGFzaE1hcAUH2sHDFmDRAwACRgAKbG9hZEZhY3RvckkACXRocmVzaG9sZHhwP0AA\r\nAAAAABB3CAAAABAAAAAAeHA=]]></p></ps>", "org____g4studio____core____mvc____xstruts____action____LOCALE" : "<ps><p n=\"_dflt_\" mg=\"1\"><![CDATA[zh_CN]]></p></ps>" }
情形2:配置
<property name="org.g4studio.core.metatype.impl.BaseDto" magic="5" serial="org.frameworkset.soa.JDKSerial"/>
序列化结果:
/* 0 */ { "_id" : ObjectId("53bf358c2623990a8ccd44bc"), "sessionid" : "43521432-7539-4af8-9a31-67d33e0d4c9c", "creationTime" : NumberLong("1405040012898"), "maxInactiveInterval" : NumberLong(3600000), "lastAccessedTime" : NumberLong("1405040019849"), "_validate" : true, "appKey" : "g4studio", "referip" : "0:0:0:0:0:0:0:1", "host" : "172.168.8.101-tt-nn", "requesturi" : "/g4studio/login.do", "lastAccessedUrl" : "/g4studio/login.do", "httpOnly" : false, "secure" : false, "lastAccessedHostIP" : "172.168.8.101-tt-nn", "SessionContainer" : "<ps><p n=\"_dflt_\" cs=\"org.g4studio.common.util.SessionContainer\"><p n=\"reportData\" s:nvl=\"true\" s:t=\"org.g4studio.core.web.report.jasper.ReportData\"/><p n=\"userInfo\" s:nvl=\"true\" s:t=\"org.g4studio.system.common.dao.vo.UserInfoVo\"/><p n=\"reportDto\" s:t=\"org.g4studio.core.metatype.impl.BaseDto\"><m cmt=\"bean\"></m></p></p></ps>", "org____g4studio____core____mvc____xstruts____action____LOCALE" : "<ps><p n=\"_dflt_\" mg=\"1\"><![CDATA[zh_CN]]></p></ps>" }
请帮忙看看是什么问题。
13 楼
yin_bp
2014-07-10
多谢反馈问题,特回复如下:
httpOnly属性目前只有在符合servlet 3.0规范容器中才提供了相应的设置API,因此如果使用tomcat的话,就需要tomcat 7及以上版本的httpOnly才会被设置为true(网上也有不通过api就可以设置httpOnly属性的方式,但是一直没有尝试 )
首先要说明一下,bboss序列化是支持具有引用关系的对象序列化和反序列化的。为了验证这个功能,我特意在session共享demo工程中的sessiontest.jsp增加了一段代码:
上面的代码片段向共享session中存入具备引用关系的对象,然后从共享session获取这个对象,经过验证是能够正确序列化存储和读取具有引用关系对象的,有时间的话可以自己获取会话共享demo(最好是带监控功能的demo这样好在线浏览session中的数据)进行验证。
另外,我看了一下g4studio中的SessionContainer类的源码,SessionContainer对象无法反序列化,具体原因可能和SessionContainer类结构有关系,其中定义了一个Dto对象reportDto:
之所以无法序列化,可能和这个reportDto属性有关系,SessionContainer类的构造函数中将reportDto初始化为org.g4studio.core.metatype.impl.BaseDto的实例:
建议在bboss的序列化插件配置文件/resources/org/frameworkset/soa/serialconf.xml中指定
org.g4studio.core.metatype.impl.BaseDto的序列化插件为:
org.frameworkset.soa.JDKSerial
例如:
如果还有问题的话,建议将序列化SessionContainer产生的xml串或者错误信息发出来让我看看。
sarkara 写道
另外在xml里面把httpOnly设置为True后,在客户端的cookie的httpOnly仍然没被正确设置为true。
httpOnly属性目前只有在符合servlet 3.0规范容器中才提供了相应的设置API,因此如果使用tomcat的话,就需要tomcat 7及以上版本的httpOnly才会被设置为true(网上也有不通过api就可以设置httpOnly属性的方式,但是一直没有尝试 )
sarkara 写道
前面比较忙,所以回帖晚了。向楼主说了一下测试情况。
挑了网上另外一个开源的框架https://github.com/xiongchun/g4studio做测试。
测试不成功。经查:该框架的session存储对象为https://github.com/xiongchun/g4studio/blob/master/project/src/main/java/org/g4studio/common/util/SessionContainer.java,SessionContainer 还引用了org.g4studio.system.common.dao.vo.UserInfoVo作为真正的登陆用户存储对象。查询mongodb,发现UserInfoVo序列化不正确,所以也无法正确反序列化。所以测试失败原因应该是bboss序列化SessionContainer错误导致。
进一步测试:在session里直接存储UserInfoVo,测试是成功的。
推测:如果对象里引用了对象,bboss序列化/反序列化机制会发生错误,bboss的序列化/反序列化还有进一步改进的必要。
挑了网上另外一个开源的框架https://github.com/xiongchun/g4studio做测试。
测试不成功。经查:该框架的session存储对象为https://github.com/xiongchun/g4studio/blob/master/project/src/main/java/org/g4studio/common/util/SessionContainer.java,SessionContainer 还引用了org.g4studio.system.common.dao.vo.UserInfoVo作为真正的登陆用户存储对象。查询mongodb,发现UserInfoVo序列化不正确,所以也无法正确反序列化。所以测试失败原因应该是bboss序列化SessionContainer错误导致。
进一步测试:在session里直接存储UserInfoVo,测试是成功的。
推测:如果对象里引用了对象,bboss序列化/反序列化机制会发生错误,bboss的序列化/反序列化还有进一步改进的必要。
首先要说明一下,bboss序列化是支持具有引用关系的对象序列化和反序列化的。为了验证这个功能,我特意在session共享demo工程中的sessiontest.jsp增加了一段代码:
//下面的功能演示存储一个复杂对象(包含引用关系)到session中,然后读取出来验证对象关系是否正确还原 TestVO testVO = new TestVO(); testVO.setId("testvoid"); TestVO1 testVO1 = new TestVO1(); testVO1.setName("hello,test vo1"); testVO.setTestVO1(testVO1); session.setAttribute("testVO", testVO); testVO = (TestVO)session.getAttribute("testVO"); //修改testVO中属性的值 testVO.setId("testvoidaaaaa"); //需要将修改后的对象重新设置到session中否则无法存储最新的testVO到mongodb中 session.setAttribute("testVO", testVO);
上面的代码片段向共享session中存入具备引用关系的对象,然后从共享session获取这个对象,经过验证是能够正确序列化存储和读取具有引用关系对象的,有时间的话可以自己获取会话共享demo(最好是带监控功能的demo这样好在线浏览session中的数据)进行验证。
另外,我看了一下g4studio中的SessionContainer类的源码,SessionContainer对象无法反序列化,具体原因可能和SessionContainer类结构有关系,其中定义了一个Dto对象reportDto:
/** * 报表对象集, */ private Dto reportDto;
之所以无法序列化,可能和这个reportDto属性有关系,SessionContainer类的构造函数中将reportDto初始化为org.g4studio.core.metatype.impl.BaseDto的实例:
public SessionContainer() { super(); reportDto = new BaseDto(); }
建议在bboss的序列化插件配置文件/resources/org/frameworkset/soa/serialconf.xml中指定
org.g4studio.core.metatype.impl.BaseDto的序列化插件为:
org.frameworkset.soa.JDKSerial
例如:
<properties> <property name="java.util.Locale" magic="1" serial="org.frameworkset.soa.LocaleSerial"/> <property name="net.sf.jasperreports.engine.JasperPrint" magic="2" serial="org.frameworkset.soa.JDKSerial"/> <!-- 指定BaseDto对象的序列化机制为jdk自带的序列化机制 --> <property name="org.g4studio.core.metatype.impl.BaseDto" magic="3" serial="org.frameworkset.soa.JDKSerial"/> <!-- <property name="com.frameworkset.platform.security.authentication.CheckCallBack$Attribute" magic="3"/> --> <!-- <property name="com.frameworkset.platform.security.authentication.CheckCallBack" magic="4"/> --> <!-- <property name="com.frameworkset.platform.security.authentication.Credential" magic="5"/> --> <!-- <property name="com.frameworkset.platform.security.authorization.AuthPrincipal" magic="6"/> --> <!-- <property name="com.xxx.xxx.POXxxxx" magic="3" preserial="org.frameworkset.soa.POXxxxxSerial"/> --> </properties>
如果还有问题的话,建议将序列化SessionContainer产生的xml串或者错误信息发出来让我看看。
12 楼
sarkara
2014-07-10
另外在xml里面把httpOnly设置为True后,在客户端的cookie的httpOnly仍然没被正确设置为true。
11 楼
sarkara
2014-07-10
前面比较忙,所以回帖晚了。向楼主说了一下测试情况。
挑了网上另外一个开源的框架https://github.com/xiongchun/g4studio做测试。
测试不成功。经查:该框架的session存储对象为https://github.com/xiongchun/g4studio/blob/master/project/src/main/java/org/g4studio/common/util/SessionContainer.java,SessionContainer 还引用了org.g4studio.system.common.dao.vo.UserInfoVo作为真正的登陆用户存储对象。查询mongodb,发现UserInfoVo序列化不正确,所以也无法正确反序列化。所以测试失败原因应该是bboss序列化SessionContainer错误导致。
进一步测试:在session里直接存储UserInfoVo,测试是成功的。
推测:如果对象里引用了对象,bboss序列化/反序列化机制会发生错误,bboss的序列化/反序列化还有进一步改进的必要。
挑了网上另外一个开源的框架https://github.com/xiongchun/g4studio做测试。
测试不成功。经查:该框架的session存储对象为https://github.com/xiongchun/g4studio/blob/master/project/src/main/java/org/g4studio/common/util/SessionContainer.java,SessionContainer 还引用了org.g4studio.system.common.dao.vo.UserInfoVo作为真正的登陆用户存储对象。查询mongodb,发现UserInfoVo序列化不正确,所以也无法正确反序列化。所以测试失败原因应该是bboss序列化SessionContainer错误导致。
进一步测试:在session里直接存储UserInfoVo,测试是成功的。
推测:如果对象里引用了对象,bboss序列化/反序列化机制会发生错误,bboss的序列化/反序列化还有进一步改进的必要。
10 楼
yin_bp
2014-07-05
sarkara 写道
楼主神速,
试试看行不行。
试试看行不行。
如有问题记得反馈给我
9 楼
sarkara
2014-07-02
楼主神速,
试试看行不行。
试试看行不行。
8 楼
yin_bp
2014-06-30
发表评论
-
bboss mvc控制器方法跳转地址设置方法介绍
2017-12-09 21:52 913bboss mvc控制器方法跳转地址设置方法介绍 1.直接指 ... -
bboss mvc json插件设置日期类型格式方法
2017-02-28 11:33 746bboss mvc json插件设置日期类型格式方法 一般的 ... -
bboss session手动移除用户会话方法介绍
2016-12-31 21:01 1005bboss session手动移除用户会话方法介绍。 在一些 ... -
bboss session集成权威指南
2016-10-15 13:15 1440本文档已做调整,访问地址: bboss session集成权威 ... -
bboss session listener实现和配置方法
2016-10-14 10:50 975bboss session listener类似于servle ... -
bboss mvc控制器实现etag和last modify两种http缓存机制
2016-09-07 23:48 1271bboss mvc控制器实现etag和last modify两 ... -
bboss wordpdf构建部署介绍
2016-09-02 15:47 571bboss wordpdf构建部署介绍 下载 源码下载地址: ... -
bboss session版本构建和demo部署运行介绍
2016-07-24 10:19 1260bboss session版本构建和demo部署运行介绍 1. ... -
bboss session自定义session id生成机制介绍
2016-06-04 11:18 2684bboss session自定义session id生成机制介 ... -
bboss session redis插件使用指南
2016-03-29 14:46 1715bboss session 采用redis存储会话功能介绍,b ... -
解决tomcat stop报Illegal access: this web application instance has been stopped异常方法
2015-12-26 23:41 5962解决tomcat stop报Illegal access: t ... -
bboss 会话管理session操作使用示例
2015-12-24 09:21 1082bboss 会话管理session操作使用示例(遵循servl ... -
bboss session会话属性数据查询功能配置使用方法
2015-12-22 20:52 1203bboss session会话属性数据查询功能配置使用方法. ... -
bboss mvc文件上传实例
2015-06-08 11:13 37本文着重介绍bboss mvc文件上传功能,切入正题 功能点 ... -
apache 2.4.12 负载均衡配置
2015-06-06 15:56 1367apache 2.4.12 负载均衡配置比较简单,修改http ... -
bboss会话共享培训文档分享
2015-01-19 22:24 2823bboss会话共享培训文档分享,涵盖bboss会话共享以下内容 ... -
bboss mvc @RequestBody注解使用说明
2014-10-23 15:53 1054@RequestBody可以将客户端请求报文体通过数据类型转换 ... -
bboss安全认证过滤器认证后重定向到请求页面功能介绍
2014-10-12 10:55 1350本文介绍bboss安全认证 ... -
bboss mvc控制器方法响应报文注解ResponseBody使用说明
2014-09-20 22:39 1197bboss mvc控制器方法响应 ... -
bboss mvc启动事件监听器使用方法
2014-09-02 20:25 1161在实际应用,往往需要在mvc容器启动后执行相应的操作,bbos ...
相关推荐
集群会话共享,跨容器跨平台,跨站跨应用会话共享及SSO,高效,配置简单,提供实用的会话统计监控和会话集中管理功能(会话查询,会话删除,会话属性数据查看等等)
对于修改session中的对象数据,必须调用session.setAttribute方法将对象数据更新到MongoDB中,从而实现数据的共享。 bboss会话共享还提供了两种模式: 1. 集群间会话共享模式,这种模式实现了一个应用集群中各个...
该项目是一款基于Java和Shell语言的bboss session framework设计源码,专注于实现跨域集群节点之间的会话共享,并具备良好的会话监控和数据统计功能。该框架包含222个文件,包括164个Java源文件、14个XML配置文件、6...
本培训文档将介绍集群session管理的发展历史、bbosssession的架构及特点、性能指标、与应用的集成方式、部署模式以及场景演示等,旨在帮助技术人员理解并掌握bbosssession的使用方法和优势。 一、集群session管理...
本项目是基于JavaScript和CSS开发的bboss会话共享demo,包含421个文件,其中包括114个GIF图像文件、111个JPG图像文件、88个PNG图像文件、29个JavaScript脚本文件、20个CSS样式表文件、18个XML配置文件、12个JSP页面...
3. **销毁清理**:当应用关闭或过滤器不再使用时,`destroy()`方法会被调用,用于清理资源。 在BBoss框架中,安全认证通常涉及以下步骤: 1. **用户登录**:用户通过提交用户名和密码发起登录请求,服务器验证这些...
本文将详细介绍如何在BBoss的IOC配置文件中引用外部属性文件,以便更好地管理和动态配置应用。 首先,BBoss的IOC配置文件通常是一个XML文件,比如`bboss-ioc.xml`,在这个文件中我们可以声明并配置各种bean。当需要...
在“bboss mvc开发手册.doc”中,我们可能会找到关于如何使用BBoss MVCDemo进行开发的详细指南。 首先,让我们深入了解BBoss MVCDemo的核心特性: 1. **模型(Model)**:BBoss MVCDemo支持多种数据访问方式,如JDBC...
本实例是一个基于bboss es spring boot starter的demo maven工程,可供spring boot项目集成bboss elasticsearch rest client参考 展示了通过spring boot管理单集群功能和管理多集群功能 单集群测试用例:...
Elasticsearch rest client bboss介绍-Elastic2018中国开发者大会演讲稿
BBoss(全称为bbossgroups)是一个专为企业级J2EE应用设计的开源框架,它为Java开发者提供了一系列强大的工具和服务,以简化Web应用程序的开发过程。该框架旨在提高开发效率,降低维护成本,同时保持高度的灵活性和...
**二、BBoss介绍** BBoss 是一个针对 Elasticsearch 的企业级开发框架,它提供了丰富的 Java API,使得开发者可以更简单地进行索引管理、查询构建、结果分析等操作。BBoss 还支持多版本兼容,方便应对 Elasticsearch...
该项目是基于Java语言的bboss开源框架构建的设计源码,包含3075个文件,涵盖2700个Java...本项目基于bboss框架构建了数据采集ETL工具、流批一体化Stream工具、Elasticsearch客户端工具和WebSession共享框架等应用。
springboot集成ElasticsearchBboss调用Elasticsearch的案例分享
在`demo`这个文件中,可能包含了使用bboss操作Elasticsearch的基本示例代码。例如,创建索引、插入文档、执行查询等。通常,这些示例会展示如何初始化bboss客户端,如何构造和执行DSL查询,以及如何处理返回结果。 ...
**bboss-datatran** 是一个由 **bboss** 社区开源的高效数据处理工具,专注于数据采集、数据清洗转换以及数据入库等任务。...通过深入学习和使用bboss-datatran,用户可以提升数据处理效率,更好地挖掘数据的价值。
3. `bboss-util-5.5.0.jar`和`bboss-persistent-5.5.0.jar`:这是BBoss框架的核心组件,提供了许多实用工具类和持久化操作支持,如数据库连接、事务管理等,为Elasticsearch的数据导入提供底层支持。 4. `...
【bboss-db-elasticsearch-tool-master_java_】是一个Java ORM(对象关系映射)框架,它在功能上超越了MyBatis,提供了对多种数据库的广泛支持,包括MySQL、Oracle、PostgreSQL、SQLServer、DB2、DM以及MongoDB。...