您的位置:首页 > 编程语言 > Java开发

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

2015-08-31 11:43 721 查看
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毫米

前台就会提示重复提交!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: