JBoss Session经验技巧总结
在无论是否采用EOS的J2EE架构的业务系统中,几乎都会遇到下述关与Session超时、重启J2EE服务器后,业务系统功能出现的一些奇怪想象。本文将以JBoss为例,解释一些与Session有关的现象,并论述那些是正常想象,那些不是正常想象并提供解决方案。
2 不同浏览器Session相互渗透
2.1 步骤及现象
1、在Windows系统以“开始->程序->Internet Explorer”启动一个浏览器(窗口A),然后在地址栏中输入服务器地址,登录应用系统;
2、在窗口A中,选择主菜单“文件->新建->窗口”,启动另一个浏览器(窗口B),如图;
3、分别在“窗口A”和“窗口B”中操作业务功能;
4、点击“窗口A”的“注销”功能,则“窗口B”的业务功能也不能正常使用;
5、重新在“窗口A”登录,则“窗口B”的业务功能也可正常使用;
6、若在“窗口A”中用不同于第一次登录的用户登录系统,则“窗口B”中的用户权限也更改为新的用户权限。
在这一现象中,利用“窗口A”新建“窗口B”,那么“窗口A”和“窗口B”是共有一份Session,也即服务器不会为“窗口B”重新建立一份Session空间,因此会出现这种Session互窜的现象。
这种现象属于正常现象。若要在同一客户机是使用不同的用户登录系统,可以通过“开始->程序->Internet Explorer”的方式启动不同的两个浏览器窗口,以便服务器为这两个不同的窗口创建不同的Session。
3 JBoss重启后Session不失效
3.1 步骤及现象
1、启动JBoss服务器(
2、以系统用户登录应用系统,点击其中的业务功能;
3、在Linux/Unix系统中,用JBoss提供的脚本文件停止JBoss服务器进程(如果是在EOS Studio中启动服务器,可用“Studio工具条”的“停止服务器”
4、重新启动JBoss服务器;
5、点击浏览器窗口中的业务功能;
6、在EOS开源的fbframe中,如果访问的是设置了“需要校验”的展现逻辑,则系统提示“没有访问xxx资源的权限!”;
7、在EOS开源的fbframe中,如果访问的是未设置“需要校验”功能,则系统功能能正确访问、执行;
8、重新登录系统后,所有功能均能正确访问、执行;
9、在Linux/Unix系统中,用“kill
10、 再次访问已登录窗口的业务功能,则所有功能均不能正常执行。
在一些J2EE服务器中有这样一种机制:在服务器正常停止的时候,服务器会将Session中的对象序列化,然后保存到服务器硬盘上,当服务器重新启动后,服务器会重新加载这些被序列化的Session对象。由于EOS的开源fbframe框架中的权限控制是缓存于JVM内存中的,需要用户重新登录才能重新缓存这些数据,因此在实际运行的时候,开源框架的权限控制模块不能读取用户的权限配置信息,从而出现“步骤现象”中的现象。如果是非正常终止服务器(kill -9或
对JBoss服务器来说,Session序列化后重新加载的功能在
一般的客户都接受“服务器重启后需要重新登录”这个概念,因此可以利用JBoss的开关,将Session序列化后重新加载的功能关闭:
在业务系统的WEB-IN目录下建立一个context.xml文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Manager className="org.apache.catalina.session.StandardManager" pathname=""/>
</Context>
4 新开窗口时Session过期的处理方法
1、启动浏览器,登录系统;
2、点击带有打开模态端口按钮的页面,等待Session超时;
3、Session超时后,点击按钮打开模态窗口;
4、如果引用系统的需求实现是:Session超时后,浏览器重新回到登录页面;
5、如果在实现的代码是利用location=url的方式实现,那么在客户端会出现重新打开一个浏览器,并在新浏览器中显示登录页面(也可能出现模态窗口呈现白色页面,也即模态窗口不能显示正常的功能页面或登录页面)。
在IE的Javascript中,利用showModalDialog方法开启的窗口与用open方法打开的窗口不大一样,前者打开的窗口是模态窗口,不具有location等window的属性;后者打开的窗口对象与普通窗口一样。因此,在Session后,页面利用location属性自动转向到登录页面,就会引起javascript错误,但是模态窗口不具有状态栏,看不到这个错误消息,因此出现白色的模态页面。
如果在模态窗口中利用showModalDialog方法传递来的父窗口window,使用window.location = url的方式转向到登录页面,由于父窗口不能获得焦点,不能设置location属性的值,因此出现客户机开启新的浏览器,并将浏览器转向到登录页面。
对于这样的情况,一般都是将模态窗口关闭,利用父窗口的window.location,将父窗口流转到登录页面。这里还需要考虑的问题是:如果在模态窗口中又打开了一个模态窗口,那么需要递归地将模态窗口关闭,将最后一个非模态窗口的location设置为登录页面。因此,最关键的是需要在调用showModalDialog函数的时候,将并页面的window对象传递给新的模态窗口,然后在关闭子窗口时,判定父窗口是否是模态窗口,如果是,将父窗口关闭,依次递归,直到父窗口为非模态窗口为此。
以下是示例代码,main.html页面具有打开模态窗口功能页面(打开timeout.html页面,模拟Session失效后流转的目标页面)。
Main.html代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>主页面</title>
<script language="">
function openModWin(){
var temp = window.showModalDialog("timeout.html",window.top,"dialogWidth=800px;dialogHeight=600px");//将父窗口作为参数传递到子窗口
}
</script>
</head>
<input type="button" value="MOD" onclick="nojavascript...openModWin();"/>
<body>
</body>
</html>
Timeout.tml代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>超时页面</title>
</head>
超时页面
<body>
</body>
</html>
<script language="javascript">
function loginWin(){
var tempWin = window;
while(tempWin.dialogArguments){//循环关闭模态窗口,
alert(tempWin);
tempWin.close();
tempWin = tempWin.dialogArguments.window;
}
tempWin.top.location = "login.html";
}
setTimeout(loginWin,3000);
</script>
Login.html(登录页面)代码如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>登录页面</title>
</head>
登录页面
<body>
</body>
</html>
也可构造模态窗口打开模态窗口的情况进行测试
- 上一篇:Datacell实现级联解决方法[ 10-14 ]
- 下一篇:如何设置EOS的JVM内存[ 11-29 ]