Acegi安全架構在AJAX下的逾時控制
當我們使用Acegi安全架構時,一般都會對所有請求就像攔截。這樣,如果session逾時,通過DWR進行Ajax遠程調用時,同樣會被Acegi的Filter攔截,這時Acegi發現使用者沒有登入,就會對請求進行轉寄(轉寄到登入頁面),但由於此時進行的是Ajax的調用,頁面並不會將進行跳轉,而是返回302的HTTP響應碼,這樣瀏覽器就不會有任何的反應,這樣對使用者是非常不友好的。可以通過一些簡單的處理,在session逾時後,當使用者進行Ajax遠程調用時,同其他請求一樣,返回到登入頁面。
首先,在Acegi的安全設定檔(即Spring的設定檔)裡面,將/dwr/**路徑的請求配置為可以匿名使用者可以訪問的。
其次,自訂一個DWRRemoter,大概實現如下:
public class MyDWRRemoter extends DefaultRemoter{<br /> public Replies execute( Calls calls ) {<br /> HttpSession session = WebContextFactory.get().getSession();<br /> ISessionContainer sc = (ISessionContainer) session.getAttribute(<br /> ISessionContainer.SESSION_CONTAINER_KEY );</p><p> //session檢查<br /> if (sc == null || sc.getUserInfo() == null) {<br /> logOut();<br /> return super.execute(new Calls());<br /> } else {<br /> IUserInfo userInfo = sc.getUserInfo();<br /> if(!SecurityFactory.getInstance().isOnline(<br /> userInfo.getUserID(), session.getId())) {<br /> logOut();<br /> return super.execute(new Calls());<br /> }<br /> }<br /> return super.execute( calls );<br /> }</p><p> private void logOut() {<br /> WebContext wct = WebContextFactory.get();<br /> Util utilThis = new Util(wct.getScriptSession());<br /> utilThis.addScript( new ScriptBuffer("logOut()"));<br /> }<br />}在web.xml檔案中加入DWR的參數,是自訂的DWRRemoter生效:
<init-param><br /> <param-name><br /> org.directwebremoting.extend.Remoter<br /> </param-name><br /> <param-value>com.xxx.base.framework.web.MyDWRRemoter</param-value><br /></init-param>
最後,在JSP頁面上寫下方法名為logOut的JavaScript函數,該函數返回到登入頁面即可。
通過上面的三個簡單步驟,即可實現在DWR調用遠程方法時,如果session逾時,系統順利的退出到登入頁面的效果。