天天看點

頁面防止重複送出,在服務端使用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調轉到增加界面是不需要通過背景的,是以在背景增加一個方法:

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

前台就會提示重複送出!