JSP入門のはFormフォームの繰り返し提出するいくつかの方案を免れます.

13043 ワード

JSP入門の初級学習者フォームの提出は非常に迷惑な問題ですが、Formフォームが何度も提出されないようにするにはどうすればいいですか?以下のいくつかの面から入手できます.
一.初心者JSPについては、まずJavascriptで設定することができます.
変数を設定します.一回だけフォームの提出を許可します. 

  
  
  
  
  1. ﹤script language="javascript"﹥   
  2.  var checkSubmitFlg = false;   
  3.  function checkSubmit() {   
  4.  if (checkSubmitFlg == true) {   
  5.  return false;   
  6.  }   
  7.  checkSubmitFlg = true;   
  8.  return true;   
  9.  }   
  10.  document.ondblclick = function docondblclick() {   
  11.  window.event.returnValue = false;   
  12.  }   
  13.  document.onclick = function doconclick() {   
  14.  if (checkSubmitFlg) {   
  15.  window.event.returnValue = false;   
  16.  }   
  17.  }   
  18. ﹤/script﹥   
  19.    
  20. ﹤html:form action="myAction.do" method="post" onsubmit="return checkSubmit();"﹥  
二. JSP人門についてはJavascriptのもう一つの設定を把握しなければなりません.
フォーム提出ボタンまたはイメージをdisableにします.

  
  
  
  
  1.  ﹤html:form action="myAction.do" method="post"   
  2.  onsubmit="getElById('submitInput').disabled = true; return true;"﹥    
  3.  ﹤html:image styleId="submitInput" src="images/ok_b.gif" border="0" /﹥    
  4.  ﹤/html:form﹥ 
第三に、JSP入門段階においても、STRUTSの同期トークン機構を利用して、同期トークン(Token)機構を利用して、WebアプリケーションにおいてFormフォームの繰り返し提出の問題を解決することに注意し、Strutsも参照の実現を与えた.
基本原理:
サーバ側は、到着した要求を処理する前に、要求に含まれるトークン値と現在のユーザセッションに保存されているトークン値とを比較し、一致するかどうかを確認する.この要求を処理した後、応答をクライアントに送信する前に、クライアントに送信する以外に、ユーザセッションに保存されている古いトークンを置き換える新しいトークンが生成される.このように、ユーザが先ほどの提出ページに戻り、再度提出すると、クライアントから送信されたトークンはサーバ端末のトークンと一致しなくなり、重複した送信の発生を効果的に防ぐことができる. 
if (istokenValid(request) true {   
  •  // ヨール コード here   
  •  return mappingn.findForward(「success」);   
  • } else {   
  •  saveToken(request)   
  •  return mappingn.findForward("submitagain")   
  • )   STRUTSは、ユーザセッションIDと現在のシステム時間に基づいて一意(セッション毎)トークンを生成し、具体的には、TokenProcessorクラスのgeneratoken()方法を参照することができる.
    1.//検証トランザクション制御トークン、<html:form>は自動的にセッション中の識別に基づいてトークンを生成し、2回の提出を防ぐ.
    2.actionで:
    
      
      
      
      
    1.  //﹤input type="hidden" name="org.apache.struts.taglib.html.TOKEN"   
    2.  // value="6aa35341f25184fd996c4c918255c3ae"﹥   
    3.  if (!isTokenValid(request))   
    4.  errors.add(ActionErrors.GLOBAL_ERROR,   
    5.  new ActionError("error.transaction.token"));   
    6.  resetToken(request); // session   
    3.actionトークンを生成する方法がある.
    
      
      
      
      
    1. protected String generateToken(HttpServletRequest request) {   
    2.  HttpSession session = request.getSession();   
    3.  try {   
    4.  byte id[] = session.getId().getBytes();   
    5.  byte now[] =   
    6.  new Long(System.currentTimeMillis()).toString().getBytes();   
    7.  MessageDigest md = MessageDigest.getInstance("MD5");   
    8.  md.update(id);   
    9.  md.update(now);   
    10.  return (toHex(md.digest()));   
    11.  } catch (IllegalStateException e) {   
    12.  return (null);   
    13.  } catch (NoSuchAlgorithmException e) {   
    14.  return (null);   
    15.  }   
    16.  }  
    更新時にフォームボタンの重複クリックを防止し、主にSessionで判断します.
    四.JSP入門時にはページ方式を把握する必要があります.
    
      
      
      
      
    1. ﹤input type="hidden " name=" ﹤% =com.lims.util.SynchroToken.TOKEN_NAME%﹥ " value =" ﹤%= com.lims.util.SynchroToken.getToken(request)%﹥" ﹥    
    2.  
    3. SynchroToken.java  
    4. package com.lims.util;  
    5. import org.apache.struts.util.*;  
    6. import javax.servlet.http.*;  
    7. import javax.servlet.jsp.*;  
    8. import org.apache.struts.action.*;  
    9. /**  
    10.   * ﹤p﹥Title: SynchroToken ﹤/p﹥  
    11.   * ﹤p﹥Description: ﹤/p﹥  
    12.   * ﹤p﹥Copyright: Copyright (c) 2004﹤/p﹥  
    13.   * ﹤p﹥Company: NetStar﹤/p﹥  
    14.   * @author Jstar  
    15.   * @version 1.0  
    16.   * Created in 2004/04/21  
    17.   */  
    18. public class SynchroToken{  
    19.  public final static java.lang.String TOKEN_NAME = "_token";  
    20.  public static boolean checkToken (HttpServletRequest request){  
    21.    boolean isEqual = false;  
    22.    HttpSession session = request.getSession ();  
    23.    String formToken = request.getParameter (TOKEN_NAME);  
    24.    String sessionToken = (String)session.getAttribute (TOKEN_NAME);  
    25.    System.out.println ("formToken: " + formToken + " sessionToken: " +  
    26.                        sessionToken);  
    27.    if (formToken != null && sessionToken == null){  
    28.      session.setAttribute (TOKEN_NAME, formToken);  
    29.      isEqual = true;  
    30.    }  
    31.    return isEqual;  
    32.  }  
    33.  /**  
    34.   * Insert the method's description here.  
    35.   * Creation date: (4/19/2004 3:23:25 PM)  
    36.   * @return java.lang.String  
    37.   * @param request javax.servlet.http.HttpServletRequest  
    38.   */  
    39.  public static String getToken (HttpServletRequest request){  
    40.    String token = "" + System.currentTimeMillis ();  
    41.    HttpSession session = request.getSession ();  
    42.    if (session != null){  
    43.      session.removeAttribute (TOKEN_NAME);  
    44.    }  
    45.    return token;z  
    46.  }  
    47.  /**  
    48.   * Insert the method's description here.  
    49.   * Creation date: (4/19/2004 3:24:10 PM)  
    50.   * @return java.lang.String  
    51.   */  
    52.  final static java.lang.String getTOKEN_NAME (){  
    53.    return TOKEN_NAME;  
    54.  }  
    55.  public static String message (PageContext pageContext, String key) throws  
    56.      JspException{  
    57.    return RequestUtils.message (pageContext, null, null, key);  
    58.  }  
    59. }   
    60.  
    五.中継ページを追加することにより、
    JSP入門の角度については、中継ページを追加することにより、視覚的には良くないが、ページ間では煩雑であるが、Formフォームの重複提出を効果的に回避する良い方法である.