Dorado 5 : 03. session timeout

核心提示

利用Command的$javascript参数处理机制

原理说明

dorado的ajax提交处理机制中,为方便开发特别的对outParameter提供了$javascript参数。
其处理机制为:当这个ajax提交到后台时,开发人员可以根据后台执行的业务逻辑需要动态注入一段js脚本作为RPCCommand的outParameter参数$javascript的值,当这个ajax请求结束后,browser端接收到这个参数时,就会自动执行它:

var script = outParameters.getValue("$javascript");
if (script) eval(script);

利用以上机制,我们就可以在session-timeout时,我们注入类似如下的代码:

outParameter.setString("$javascript", "window.open('login.jsp');");

从而重新登录系统。

实现步骤说明(1):session超时判断入口

我们希望能在一个统一的入口判断session超时,由于所有的提交请求都会触发DefaultViewModel的handleUpdate,handleRPC方法,因此我们计划定义一个自己的ViewModel,并继承DefaultViewModel.基本代码如下:

public void handleRPC(String method, ParameterSet inParam, ParameterSet outParam)
              throws Exception {
       try{
//TODO 先进行session判断,如超时抛出自定义的UserNotLoginException
              super.handleRPC(method, inParam, outParam);
       }
       catch(UserNotLoginException e){
              outParam.setString("$javascript", "window.open(XXXX);");
       }
}



public void handleUpdate(String method, ParameterSet inParam, ParameterSet outParam)
              throws Exception {
       try{
//TODO 先进行session判断,如超时抛出自定义的UserNotLoginException
              super.handleRPC(method, inParam, outParam);
       }
       catch(UserNotLoginException e){
              outParam.setString("$javascript", "window.open(XXXX);");
       }
}

另外还要记得两件事:

  • 修改setting.xml,将默认的ViewModel实现类调整为自己定义的实现类:<property name="view.defaultViewModel" value="**.**.MyViewModel"/>
  • 系统开发所有的实现类都继承自定义的实现类;

实现步骤说明(2):browser端的处理

作为更友好的界面表现方式,我们希望能够新弹出一个登录页面,在登录完成之后用户可以继续自己的工作。通常做法是在主框架中定义一个subwindow,其中包含登录功能,如id为winLogin,然后再主框架上定义一个function:

function reLogin(){
   winLogin.show(true, true);
}

做好这些准备后,我们就可以在服务器端:

outParam.setString("$javascript", "window.top.reLogin();");