1.strust1+ jsp ,在背景調轉到添加界面的方法中設定super.saveToken(request);調轉到添加界面後,填寫表單資訊,儲存後,在儲存方法中
if (!super.isTokenValid(request, true))
{
MessagePojo msg = new MessagePojo("請不要重複送出相同的資訊,本操作可能由重新整理界面導緻!", "bidInfo.do?method=bidinfoitems");
request.setAttribute("message", msg);
return mapping.findForward("message");
}
2.strtus2 + jsp,在添加界面增加strtus2标簽<s:token/>,然後在儲存的方法中對比令牌值。
3.struts2 + extJs .一般extJs調轉到增加界面是不需要通過背景的,是以在背景增加一個方法:
public String setRequestToken() throws Exception
{
String strGUID = RandomGUIDUtil.newGuid();//生成令牌
session.put("request_token", strGUID);
response.getWriter().write(strGUID);
return null;
}
在前台彈出視窗或者frompanlan中添加方法,
Ext.Ajax.request(
{
url : basePath + "material/WzPmRkMaster!setRequestToken.action",
success : function(resp, conf)
{
var token = resp.responseText;
Ext.getCmp('_token').setValue(token);
},
method : 'post'
});
那麼初始化的 令牌都生成了,
然後儲存時候,判斷令牌值是否一樣:
String strGUID = RandomGUIDUtil.newGuid(); //生成令牌
String strRequestToken = (String)session.get("request_token"); //取出會話中的令牌
String strToken = request.getParameter("token"); //頁面中的令牌
if(strRequestToken != null && strToken !=null && !strRequestToken.equals(strToken)){ //重複送出,重置令牌
session.put("request_token", strGUID);
response.getWriter().write("{success:true,token:'"+strGUID+"',message:'重複送出!'}");
return null;
}
session.put("request_token", "");//如果通過則清空request_token值,如果重複儲存,那麼request_token為空,而token值還是之前初始化的那個,這樣就會導緻令牌值不一樣,就會提示重複送出了。
測試:在前台儲存的時候設定延遲5秒:
setTimeout( function(){
addForm.getForm().doAction('submit',
{
url : url,
waitTitle : '請稍後',
waitMsg : '正在儲存資料...',
params :
{
token : Ext.getCmp('_token').getValue()
},
success : function(form, action)
{
Ext.MessageBox.show(
{
title : "提示資訊",
msg : "<nobr>" + action.result.message + "</nobr>",
icon : Ext.MessageBox.INFO,
buttons : Ext.MessageBox.OK,
fn : function()
{
Ext.getCmp("currGrid").getStore().reload();
addWin.close();
}
});
Ext.getBody().unmask();
}
});
}, 5 * 1000 );//延遲5000毫米
前台就會提示重複送出!