1》防止多次点击“提交”,让多次“提交”变成只一次“提交”
saveToken(rquest)
的目的是页面上的按钮只相应一次,比如说,在页面上有个新增按钮,如果你连续点击数次,后台程序可能会响应n次,加了这句话,在页面
上自动生成一个hidden变量
2》防止页面重复提交
利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后
,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用
户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
网上例子为证:
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
UserForm userForm = (UserForm)form;
if(!isTokenValid(request)){
saveToken(request);
userForm.setMessage("重复提交");
return mapping.findForward("failure");
}
else{
resetToken(request);
}
request.setAttribute("user", userForm);
return mapping.findForward("success");
}
}
模板经典例子:
public ActionForward save(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws BaseException {
if (!isTokenValid(request)) { // 如果指令无效,则属于重复提交
return (new ActionForward(mapping.getInput()));
} else {
resetToken(request);
}
BaseDao dao = DAOFactory.getDao(getEntityDAOClassName());
dao.begingTransaction();
Class cls = dao.getEntityClass();
try {
BaseVO vo = (BaseVO) cls.newInstance();
DataTrans.copyProperties(vo, form);
this.saveEx(mapping, form, request, response, vo);
dao.save(vo);
dao.commitTransaction();
} catch (Exception e) {
dao.rollback();
throw new BaseException("保存数据出现异常");
} finally {
dao.sessionClose();
}
return mapping.findForward("saveSuccess");
}
posted on 2011-12-02 09:32
kxbin 阅读(749)
评论(0) 编辑 收藏 所属分类:
J2EE