saveToken介

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");
 }
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值