解題思路1 : 重載Connection類
由于extjs和server端交互全都是 json格式的數據交互,server端不會控制頁面的跳轉,頁面跳轉,提示功能全都有extjs來完成。
extjs和server端的交互方法全都是繼承自 Ext.data.Connection,這個類中可以攔截所有和server端交互的方法。
server端的權限控制用acegi做的,如果沒通過acegi的驗證,沒有授權會返回到403.jsp,需要重登錄會返回到 login.jsp。
因此重載Connection類,并改寫其中的 handleResponse 方法,判斷返回的結果是否是 403.jsp,login.jsp, 如果是就進行相應的控制,如果是正常的返回數據就繼續向下執行。
我個人在403.jsp 和login.jsp 的第一行加上了 注釋代碼<!--權限控制自定義關鍵字-->,就是靠這個關鍵字來工作的
,代碼如下:
代碼如下:
//此處重載了Cunnection方法,用來攔截client與Server的交 互,
//后臺acegi攔截用戶請求后,如果無權限,返回403.jsp;如果沒登錄,返回login.jsp;
//通過Acegi攔截 后,才返回用戶想要的Json結果
Ext.override(Ext.data.Connection, {
handleResponse : Ext.data.Connection.prototype.handleResponse.createInterceptor(
function(response) {
var resText=response.responseText;
if (resText.length>10) {
resText=resText.substr(0,9);
}
if (resText=='<!--login'){
window.top.location.href = topURL+"/login.jsp";
} else if (resText=='<!--deny-'){
if (resText=='<!--deny-'){
Ext.Msg.show({
title : '錯誤提示',
msg : '禁止訪問此功能,請和系統管理員聯系',
buttons : Ext.Msg.OK,
icon : Ext.Msg.INFO
});
};
} else if (resText=='<!--404--'){
Ext.Msg.show({
title : '錯誤提示',
msg : '頁面未找到',
buttons : Ext.Msg.OK,
icon : Ext.Msg.INFO
});
}
})
});
解題思路2: server端返回菜單json數據
我的菜單用tree來做的,在初始化主頁面時先初始化菜單,
代碼如下:
loader : new Ext.tree.TreeLoader({
dataUrl : 'getJsonMenus.do'
}),
這個'getJsonMenus.do'返回菜單json數據,在strut2中的配置為:
<action name="getJsonMenus" class="jsonSystemAction" method="getJsonMenus">
<result type="json">
<param name="root">menus</param>
</result>
</action>
menus是個list<JsonMenu>,
JsonMenu的屬性為:
private String text;
private boolean expanded;
private String id;
private boolean leaf;
private List<JsonMenu> children;
getJsonMenus.do 返回的格式是可以滿足tree的格式要求的。
js代碼如下
代碼如下:
Ext.onReady(function() {
setTimeout(function() {
Ext.get('loading').remove();
Ext.getDom('header').style.visibility = 'visible';
var vp = new Ext.Viewport({
layout : 'border',
defaults : {
collapsible : true,
split : true
},
items : [{
新聞熱點
疑難解答
圖片精選