1分6合

核心企业

CORE ENTERPRISE
当前位置:网站1分6合>软件开发 > 正文内容

JBoss Session经验技巧总结

 

1 摘要

在无论是否采用EOSJ2EE架构的业务系统中,几乎都会遇到下述关与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”中的用户权限也更改为新的用户权限。

 

2.2  原因分析

       在这一现象中,利用“窗口A”新建“窗口B”,那么“窗口A”和“窗口B”是共有一份Session,也即服务器不会为“窗口B”重新建立一份Session空间,因此会出现这种Session互窜的现象。

 

2.3  解决方案

       这种现象属于正常现象。若要在同一客户机是使用不同的用户登录系统,可以通过“开始->程序->Internet Explorer”的方式启动不同的两个浏览器窗口,以便服务器为这两个不同的窗口创建不同的Session

 

3  JBoss重启后Session不失效

3.1    步骤及现象

1、启动JBoss服务器(3.2.6及以上版本),开启一个浏览器窗口;

2、以系统用户登录应用系统,点击其中的业务功能;

3、Linux/Unix系统中,用JBoss提供的脚本文件停止JBoss服务器进程(如果是在EOS Studio中启动服务器,可用“Studio工具条”的“停止服务器” 按钮停止服务器);

4、重新启动JBoss服务器;

5、点击浏览器窗口中的业务功能;

6、EOS开源的fbframe中,如果访问的是设置了“需要校验”的展现逻辑,则系统提示“没有访问xxx资源的权限!”;

7、EOS开源的fbframe中,如果访问的是未设置“需要校验”功能,则系统功能能正确访问、执行;

8、重新登录系统后,所有功能均能正确访问、执行;

9、Linux/Unix系统中,用“kill -9命令终止JBoss服务器进程(如果是在EOS Studio中启动服务器,可用“控制台”的“终止” 按钮停止服务器),然后重新启动服务器;

10、          再次访问已登录窗口的业务功能,则所有功能均不能正常执行。

 

3.2    原因分析

在一些J2EE服务器中有这样一种机制:在服务器正常停止的时候,服务器会将Session中的对象序列化,然后保存到服务器硬盘上,当服务器重新启动后,服务器会重新加载这些被序列化的Session对象。由于EOS的开源fbframe框架中的权限控制是缓存于JVM内存中的,需要用户重新登录才能重新缓存这些数据,因此在实际运行的时候,开源框架的权限控制模块不能读取用户的权限配置信息,从而出现“步骤现象”中的现象。如果是非正常终止服务器(kill -9 ),则服务器不会序列化Session,因此出现所有功能都必须登录后才能正常访问。

JBoss服务器来说,Session序列化后重新加载的功能在3.2.6及其以上版本才能出现,3.2.6以下版本未正确实现。

 

3.3    解决方案

一般的客户都接受“服务器重启后需要重新登录”这个概念,因此可以利用JBoss的开关,将Session序列化后重新加载的功能关闭:

在业务系统的WEB-IN目录下建立一个context.xml文件,文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<Context>

  <Manager className="org.apache.catalina.session.StandardManager" pathname=""/>

</Context>

 新开窗口时Session过期的处理方法

4.1    步骤及现象

1、启动浏览器,登录系统;

2、点击带有打开模态端口按钮的页面,等待Session超时;

3、Session超时后,点击按钮打开模态窗口;

4、如果引用系统的需求实现是:Session超时后,浏览器重新回到登录页面;

5、如果在实现的代码是利用location=url的方式实现,那么在客户端会出现重新打开一个浏览器,并在新浏览器中显示登录页面(也可能出现模态窗口呈现白色页面,也即模态窗口不能显示正常的功能页面或登录页面)。

 

4.2    原因分析

IEJavascript中,利用showModalDialog方法开启的窗口与用open方法打开的窗口不大一样,前者打开的窗口是模态窗口,不具有locationwindow的属性;后者打开的窗口对象与普通窗口一样。因此,在Session后,页面利用location属性自动转向到登录页面,就会引起javascript错误,但是模态窗口不具有状态栏,看不到这个错误消息,因此出现白色的模态页面。

如果在模态窗口中利用showModalDialog方法传递来的父窗口window,使用window.location = url的方式转向到登录页面,由于父窗口不能获得焦点,不能设置location属性的值,因此出现客户机开启新的浏览器,并将浏览器转向到登录页面。

 

4.3    解决方案

对于这样的情况,一般都是将模态窗口关闭,利用父窗口的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){//循环关闭模态窗口,

           &nbsp; alert(tempWin);

     &nbsp;   &nbsp;   tempWin.close();

        &nbsp;  &nbsp; 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>

      也可构造模态窗口打开模态窗口的情况进行测试

 

彩88-1分6合 大发11选5-1分6合 腾讯三分彩-1分6合 彩乐园-1分6合 彩天下-1分6合 万家彩票-1分6合 快彩网-1分6合