原理说明
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();");