在JOffice(OA)中,我們的應用程序是屬于那種One Application One Page,所有的請求都是都可以說是通過Ext.data.Connection來處理的,因此可以在這里做一個特別的處理,當session timeout時,讓程序直接跳至登錄頁。或彈出一個登錄的窗口,兩種方式均可。
JOffice(OA)中的安全采用了Spring Security 2,即用戶在未登錄或session過期中,其訪問的地址就會被轉移至login.jsp,配置如下所示:
<http auto-config="true" access-denied-page="/403.jsp" lowercase-comparisons="true" > <form-login default-target-url="/index.jsp" login-page="/login.jsp" authentication-failure-url="/login.jsp?error=true" login-processing-url="/j_security_check" /> <logout logout-url="/j_logout.do" logout-success-url="/login.jsp"/> <remember-me key="RememberAppUser"/> </http>
那么,當頁面跳至login.jsp時,我們在該頁面設置一個Response Header告訴瀏覽器,該用戶的session已經timeout,代碼如下所示:
<%response.addHeader("__timeout","true");%>
而剩下的就是處理該標識:
代碼如下:
Ext.onReady(){ Ext.util.Observable.observeClass(Ext.data.Connection);Ext.data.Connection.on('requestcomplete', function(conn, resp,options ){if (resp && resp.getResponseHeader && resp.getResponseHeader('__timeout')) { window.location.href=__ctxPath+'/login.jsp'; }});}
說明:
Connection的這個requestcomplete事件是所有的Ajax請求都必須觸發(fā)的,所以把它作為總的入口。