一、前言
接手的JAVA项目是以Spring3.0
、Struts2、Ext
Js4.0、Ibatis搭建起来的交易系统。此系统由业务操作员发起业务请求,后台进行处理并把数据返回给前台的典型业务系统。但此系统没有做到单点登录控制,由此带来一些安全性的隐患。典型例子为不同业务员可以在一台终端进行登录,但后台记录交易流水中的业务操作员为后登录柜员号,故流水记录有不准确信息。
为了保证数据信息的准确性,克服旧系统中的不安全性隐患,有必要对业务登录情况进行控制。现在有一些子系统能完成单点登录的控制,例如spring
security
等。但使用这些框架要进行组件管理及配置开发,同时使的项目比较庞杂。通过分析现有应用系统的现状,利用现有框架的特点加以控制达到技术要求的目的是最有效的方法。
二、技术分析
1.
系统中前后台联系
系统的前台使用Extjs进行数据的展示,前后台使用session
来进行联系,后台在session中保存柜员信息,Session中唯一键值为Session Id
.
2. 单点登录相关情况
系统的登录情况的控制,总结起来有三类:
a. 同一用户在不同终端上登录,最早登录用户不能进行业务处理。
b. 不同用户在同一终端上登录,最早登录用户不能进行业务处理。
c. 相同用户在同一终端上登录,互相不影响业务处理。
对于如上的前两种情况,需要对系统进行改造加以控制。
3.对于第一种情况(同一用户在不同终端上登录,最早登录用户不能进行业务处理)的分析
用户登录时产生新的session Id , 同一用户在不同终端上登录时会产生两个Session
Id.只有最新的session 才是有效的。如果我们实时记录柜员对应的最新的Session Id ,
对于后台进程中非最新的进行剔除操作即可。
为此我们建立一张记录表,来记载柜员登录时的最后的Session Id.
增加表CDC_USER_LOGIN_CTRL存储用户和登录SESSION_ID关联关系。
名称
含义
类型
字段描述及说明
USER_ID
柜员代码
VARCHAR2(10)
N
SESSION_ID
Session_id
VARCHAR2(100)
柜员登录时session_id
LAST_LOGIN_TIME
上次登录时间
DATE
FLAG
标志
VARCHAR2(4)
暂时不用
REMARK
备注
VARCHAR2(100)
暂时不用
如果柜员登录时表中没有记录,插入 一条记录,否则修改记录中的SESSION_ID.
后台根据此表判断有效的进程来控制此种情况。具体处理为后台根据session中定义的柜员,取到CDC_USER_LOGIN_CTRL相应的记录,如果数据表中记载的SESSION_ID和进程的SESSION_ID一致则为有效进程,否则为无效进程则进行剔除处理。此种算法类似反转查找处理。
4.对于第二种情况(不同用户在同一终端上登录,最早登录用户不能进行业务处理)的分析
由于两个进程都是同一Session,也即使用同一Session Id
。CDC_USER_LOGIN_CTRL表中存储的两个用户对应的Session
Id也相同。此种情况下,后台进程无法判断哪个为有效进程。
但后台Session中存放的是最后登录的柜员名,如果知道前台发起的处理是哪个操作员,此问题即可解决。在旧系统中柜员登录时,前台会记录柜员号,这样只要前台每次发请求时,带上柜员号,然后后台进程取到柜员号,和Session中记录的柜员号比较,只有一致的进程才是有效进程。
前台使用的Ext Js
4.0的技术。我们可以拦截所有向后台发送的ajax请求,在ajax处理之前,带上柜员号参数。如下为处理细节。
Ext.util.Observable.observe(Ext.data.Connection);
Ext.data.Connection.on('beforerequest',
function(con, options)
{
var tmp_str = Ext.Object.toQueryString(options.params);
tmp_str=tmp_str+"&CheckUser="+user_id;
//console.log("debug2",tmp_str);
options.params=Ext.Object.fromQueryString(tmp_str);
//console.log("debug3",options.params);
})
三、技术实现
1. 柜员登录操作时,增加CDC_USER_LOGIN_CTRL记录,保存用户名及Session Id对应关系
2. 后台的web拦截器中增加检查事项,检查如上单点控制的前两项。
3. 前台主控中增加ajax拦截处理,增加柜员号参数。
四、小结
如上对现有架构的“轻量”改造,达到了单点登录的控制。这充分体系了JAVA架构技术处理的思想,合理运用架构的层次,架构上精心的设计,能达到“事半功倍”的效果。同时也提醒我们重视现有技术架构上的扩充及发展,虽然JAVA架构的多样性带来多样的考虑,保持其架构的“轻量”和“适度”是处理架构的首要出发点。
欢迎技术同仁进行交流。