页面防止重复提交,在服务端使用struts令牌机制,前台分为jsp和extJs(其他js框架同理)

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毫米

前台就会提示重复提交!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值