1.1. MUO上下文简介
MUO(Managed-User-Object)被管用户对象,通过它可以扩展定义用户在应用中的会话信息。 扩展用户会话信息
在一般J2EE应用中,存储一个用户相关会话信息是通过HttpSession设置用户的相关属性。 对应着在EOS6也提供了相应的上下文作用域存储用户信息,即SessionContext的IUserObject。 默认userObject已提供一些常用的属性,可以在用户登录后,对这些属性进行初始化赋值。 但通常一个系统的用户信息不止只有这些,那么就需要进行扩展定义,有以下两种方式:
① 通过userObject提供的扩展属性attributes进行设置。Attributes是一个Map的属性对象,可以对其任意设置值。如: userObject.getAttributes().put(“empid”,empid);
对应在页面流的赋值操作:s:userObject/attributes/empid
② 通过user-config.xml定义MUO相关扩展属性。如: sdo:Int
优劣比较
那么这2种方式到底有什么区别,他们分别在什么情况下使用?
它们本质上都是通过HttpSession保存数据。从J2EE分层原则上看,它们都是应该在Web层(或者说是展现层,页面流)的操作,而不应该属于业务逻辑层(逻辑流)。
第①种定义的好处就是,你只能在页面流通过“s:”的方式获取会话中的数据,从而有效的隔离了逻辑流跨“层”的操作,而逻辑流想获取会话中的值必需以参数形式传递。
不便之处就是,在Studio没办法提示attributes有哪些属性可操作。
第②种定义的好处就是,你可以在逻辑流中通过“m:”的方式获取会话中的数据,而省了参数定义。但EOS6之所以允许这么处理,是因为从页面流调用逻辑流时,会将会话中的数据“拷贝”到MUO Context中,处理完后再将数据“拷贝”回会话。 但从设计的原则上来说,一个操作业务的接口应该是清晰的,需要避免隐晦的参数来源;第二:采用“m:”方式在页面流和逻辑流分开部署的结构上,不易扩展,可能会带来性能上的损失;第三:在逻辑流采用“m:”获取MUO或Session上下文的内容时,当把逻辑流暴露为对外调用的服务时,要注意参数的正确性,因为“m:”获取的参数值为本应用的会话数据。
另,在MUO或userObject/attributes定义的扩展属性值,必需是可序列化的对象!尽量简洁!
1.2. UserObject说明
用户对象是EOS6默认提供的系统对象,存储着当前会话用户的相关信息. 创建
UserObject对象创建是根据user-config.xml的配置:
false
如果Portal设置为true,默认在第一次请求时会自动创建userid为guest的UserObject对象,存储在session中。 如果Portal设置为false,则在用户系统登录时需要手动创建。
为了能够将创建的UserObject对象,纳入EOS6提供的在线用户管理OnlineUserManager,必需在登录相关的逻辑流中定义一个UserObject的变量,调用com.eos.access.http.OnlineUserManager.login方法进行构造用户实例(ABFRAME封装中已经调用保存):
销毁
销毁UserObject,即注销当前用户Session,可直接在JSP文件里调用invalidate()方法: session.invalidate();
非Portal的访问模式可在运算逻辑里判断用户是否存在,可使用以下代码判断: DataContextManager.current().getSessionCtx().getUserObject() 引用类型:com.eos.data.datacontext.IuserObject.java
字段说明 类型 Long String String String String String String String String String String Long 名称 userId userMail userName userOrgId userOrgName userRemoteIP attributes/empid attributes/operatorid attributes/orgcode attributes/orgseq attributes/orgtype attributes/roles 说明 用户登录名 用户邮箱地址 用户名称 登录机构内部ID 登录机构号 登录人员IP 机构人员ID 操作员ID与empid一致 登录机构编号 登录机构序列 登录机构类型 登录员工的角色列表(已经过构件过滤) 1.3. userIntegrated说明
存储着当前会话更丰富的用户相关信息 ,以后扩展也将是在些下增加。
引用类型:org.gotop.abframe.dataContext.MUOUserSession.java 类型 Long String String String String String String String String String String String Long String String String[] String DataObject[] Long String String 名称 orgid orgname orgcode orgdegree zipcode gvBdxzqh gvBdsm gvBdsxm gvBdxxm gvBdsID gvBdsxID gvBdxxID empid empcode empname roleid gvTxdm userOrgs mainOrgid empysryid1 orgysjgid 说明 登录后的机构ID 登录后的机构名称 登录后的机构编码 登录后的机构等级 登录后的机构邮编 本地省名 本地城市名 本地县市名 本地省ID 本地城市ID 本地县市ID 登录员工ID 登录员工代码 登录员工名称 登录人角色名 登录台席 人员可管理机构 登录人员所处的主机构 映射人员ID 映射机构ID 可参考类:
MUOUserSession.java。
1.4. 配置及使用方法
配置:登录eos-governor。依次 配置->MUO->MUO属性信息。如图配置:
不同场景使用方法
1) 逻辑流
m:XPATH_EXPRESSION样式的表达式来访问和更新数据。如:m:userObject/attributes/operatorid
2) 页面流
s:XPATH_EXPRESSION样式的表达式来访问和更新数据。如:s:userObject/attributes/operatorid
3) 页面
<%@page import=\"org.gotop.abframe.dataContext.MUOUserSession\" %>
MUOUserSession userObjct = (MUOUserSession)session.getAttribute(\"userIntegrated\"); IUserObject userObjct = (IUserObject)session.getAttribute(\"userObject\"); String userid = userObjct.getUserId();
4) Java类
IMUODataContext muo = com.eos.data.datacontext.DataContextManager.current().getMUODataContext(); MUOUserSession userObjct = (MUOUserSession)muo.get(\"userIntegrated\"); System.out.println(userObjct.getEmpid());