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调转到增加界面是不需要通过后台的,所以在后台增加一个方法:
/**
* 设置令牌
* @return
* @throws Exception
*/
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毫米
前台就会提示重复提交!