关于门户待办刷新跨域问题的处理问题描述门户系统提供统一待办处理接口实现了与业务系统的待办信息的统一集成、集中展示。为保证待办任务处理完毕后能够及时的从门户的待办信息展现区域消失,各应用系统需要在待办的处理界面添加刷新门户待办事宜展现区域的JavaScript代码。代码如下所示:functionreloadParent(){if(typeof(top.opener.Onload)!='undefined'&&!top.opener.closed){top.opener.Onload();}}在各业务系统与统一身份认证系统实现单点登录集成后,每个业务系统的单点登录的域名是各异的,由于系统之间存在跨域问题导致业务系统待办处理完成后,通过JS不能刷新门户的待办展示列表,从而导致门户待办处理后不能自动消失,降低了用户体验。解决方案门户系统通过监控用户本地Cookie的方法,实现门户待办的及时刷新,从而保证门户待办处理完成后自动消失。实现原理如下图所示:Cookies监视器(定时监控用户Cookie状态)用户本地Cookie(默认值:空)门户系统业务系统待办处理完成后将Cookie值设置为0用户用户登录门户生成Cookie业务系统A业务系统B业务系统N当Cookie值为0时刷新门户待办列表打开业务系统待办处理页面1、用户登录门户本地浏览器生成cookie,cookie状态值默认为空。2、Cookies监视程序定时对cookie状态值进行监控。3、用户通过门户打开业务系统的待办处理页面进行待办办理,办理完成后将cookie状态值置为0。(详见示例)4、Cookies监视程序监控到cookie状态值为0时,对门户待办页面进行刷新。代码示例门户cookies监控程序代码门户cookies监控程序如下:scripttype=text/javascript//![CDATA[varcookie={};cookie.set=function(n,v,t){varexp=newDate();exp.setTime(exp.getTime()+(t||24)*60*60*1000);document.cookie=n+=+escape(v)+;expires=+exp.toGMTString()+';path=/;domain=.hq.avic.com';}cookie.get=function(n){vararr=document.cookie.match(newRegExp((^|)+n+=([^;]*)(;|$)));if(arr!=null)returnunescape(arr[2]);returnnull;}//]]functiongetTime(){if(cookie.get('test')=='0'){调用门户代办页面刷新方法:cookie.set('test',1);}}页面初始化调用functiononload(){setInterval(getTime(),4000);}/script注:在门户待办刷新时间间隔初始设置为4秒,可根据实际情况或者需求修改任意。业务系统修改cookie状态值代码示例1、Javascript实现方法示例在办理待办的页面加入如下方法。functionsetCookie(name,value,days){varexpire=newDate();expire.setTime(expire.getTime()+(24*60*60*1000)*days);document.cookie=name+=+escape(value)+;expires=+expire.toGMTString()+;path=/;domain=.hq.avic.com;}setCookie(test,0,90)参数说明:cookie名称:testcookie状态值:0cookie有效期:90注:domain=.hq.avic.com因为集团门户上接入N个系统,调用各个子系统后产生的域名发成变化,但二级域名相同,所以这里指定二级域名,实现cookie跨域调用。以上js方法需要在业务系统的待办处理页面进行调用。使用dorado平台的系统:在dorado的办理按钮成功事件onSuccess里调用写入方法:setCookie(test,0,90);这里设置cookie的名称状态需要根据门户待办取得cookie的名称状态相同。2、Java程序实现方法示例Cookie[]cookies=request.getCookies();if(cookies!=null&&cookies.length0){for(inti=0;icookies.length;i++){Cookiecookie=cookies[i];System.out.println(cookievalue:+cookie.getValue());if(test.equals(cookie.getName())){//如果cookie已存在删除cookie.setMaxAge(0);response.addCookie(cookie);}}}///用java代码创建cookie的方法如下,构造的参数是cookie的name和valueCookiecookie=newCookie(test,0);cookie.setPath(/);cookie.setMaxAge(180);cookie.setDomain(.hq.avic.com);response.addCookie(cookie);注:使用dorado平台的系统推荐使用后台方法,写在流程提交后调用完成待办之前的方法中即可,代码只写一次。通常写在完成待办的同时调用一下。3、.Net程序实现方法示例略注:需要.Net架构系统的技术人员自行编写cookies操作代码,可参考java程序的实现方式。