熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

JSP、Struts避免Form重復提交的幾種方案

2013-11-23 20:41:36  來源: Java開源技術 

   javascript 設置一個變量只允許提交一次

   還是javascript將提交按鈕或者image置為disable

  onsubmit=getElById(submitInput)disabled = true; return true;>

   利用struts的同步令牌機制

  利用同步令牌(Token)機制來解決Web應用中重復提交的問題Struts也給出了一個參考實現

  基本原理

  服務器端在處理到達的請求之前會將請求中包含的令牌值與保存在當前用戶會話中的令牌值進行比較看是否匹配在處理完該請求後且在答復發送給客戶端之前將會產生一個新的令牌該令牌除傳給客戶端以外也會將用戶會話中保存的舊的令牌進行替換這樣如果用戶回退到剛才的提交頁面並再次提交的話客戶端傳過來的令牌就和服務器端的令牌不一致從而有效地防止了重復提交的發生   if (isTokenValid(request true)) {
  // your code here
  return mappingfindForward(success);
  } else {
  saveToken(request);
  return mappingfindForward(submitagain);
  }
  Struts根據用戶會話ID和當前系統時間來生成一個唯一(對於每個會話)令牌的具體實現可以參考TokenProcessor類中的generateToken()方法   //驗證事務控制令牌會自動根據session中標識生成一個隱含input代表令牌防止兩次提交

   在action中   //   // value=aaffdcccae>
  if (!isTokenValid(request))
  errorsadd(ActionErrorsGLOBAL_ERROR
  new ActionError(errortransactiontoken));
  resetToken(request); //刪除session中的令牌
   action有這樣的一個方法生成令牌
  protected String generateToken(HttpServletRequest request) {
  HttpSession session = requestgetSession();
  try {
  byte id[] = sessiongetId()getBytes();
  byte now[] =
  new Long(SystemcurrentTimeMillis())toString()getBytes();
  MessageDigest md = MessageDigestgetInstance(MD);
  mdupdate(id);
  mdupdate(now);
  return (toHex(mddigest()));
  } catch (IllegalStateException e) {
  return (null);
  } catch (NoSuchAlgorithmException e) {
  return (null);
  }
  }  在更新的時候防止按鈕重復點擊主要是用Session來做判斷

  在JSP/Servlet中可以

  JSP頁面   SynchroTokenjava
  package comlimsutil;
  import orgapachestrutsutil*;
  import javaxservlet*;
  import orgapachestrutsaction*;
  /**
  *
  Title: SynchroToken
  *
  Description:
  *
  Copyright: Copyright (c) 
  *
  Company: NetStar
  * @author Jstar
  * @version 
  * Created in //
  */
  public class SynchroToken{
  public final static javalangString TOKEN_NAME = _token;
  public static boolean checkToken (HttpServletRequest request){
  boolean isEqual = false;
  HttpSession session = requestgetSession ();
  String formToken = requestgetParameter (TOKEN_NAME);
  String sessionToken = (String)sessiongetAttribute (TOKEN_NAME);
  Systemoutprintln (formToken:  + formToken +  sessionToken:  +
  sessionToken);
  if (formToken != null && sessionToken == null){
  sessionsetAttribute (TOKEN_NAME formToken);
  isEqual = true;
  }
  return isEqual;
  }
  /**
  * Insert the methods description here
  * Creation date: (// :: PM)
  * @return javalangString
  * @param request javaxservlethttpHttpServletRequest
  */
  public static String getToken (HttpServletRequest request){
  String token =  + SystemcurrentTimeMillis ();
  HttpSession session = requestgetSession ();
  if (session != null){
  sessionremoveAttribute (TOKEN_NAME);
  }
  return token;z
  }
  /**
  * Insert the methods description here
  * Creation date: (// :: PM)
  * @return javalangString
  */
  final static javalangString getTOKEN_NAME (){
  return TOKEN_NAME;
  }
  public static String message (PageContext pageContext String key) throws
  JspException{
  return ssage (pageContext null null key);
  }
  }


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28913.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.