自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JSP入門之避免Form表單重復(fù)提交的幾種方案

開發(fā) 后端
本文作為JSP入門初學(xué)者的幫助者通過幾種方案源碼的形式向你展示并解決如何避免FORM表單的重復(fù)提交問題。

對于JSP入門的初級的學(xué)習(xí)者表單的提交是一個非常困擾的問題,那么如何避免Form表單多次提交呢?可以從以下的幾個方面入手:

一.對于初學(xué)JSP可以先通過Javascript中設(shè)置

設(shè)置一個變量,只允許表單提交一次。 

  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人門還要掌握J(rèn)avascript的另一設(shè)置

將表單提交按鈕或者image置為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的同步令牌機(jī)制 
 
  利用同步令牌(Token)機(jī)制來解決Web應(yīng)用中重復(fù)Form表單提交的問題,Struts也給出了一個參考實現(xiàn)。

  基本原理: 

  服務(wù)器端在處理到達(dá)的請求之前,會將請求中包含的令牌值與保存在當(dāng)前用戶會話中的令牌值進(jìn)行比較,看是否匹配。在處理完該請求后,且在答復(fù)發(fā)送給客戶端之前,將會產(chǎn)生一個新的令牌,該令牌除傳給客戶端以外,也會將用戶會話中保存的舊的令牌進(jìn)行替換。這樣如果用戶回退到剛才的提交頁面并再次提交的話,客戶端傳過來的令牌就和服務(wù)器端的令牌不一致,從而有效地防止了重復(fù)提交的發(fā)生?!?

  1.  if (isTokenValid(request, true)) {   
  2.    // your code here   
  3.    return mapping.findForward("success");   
  4.   } else {   
  5.    saveToken(request);   
  6.    return mapping.findForward("submitagain");   
  7.   }   

STRUTS根據(jù)用戶會話ID和當(dāng)前系統(tǒng)時間來生成一個唯一(對于每個會話)令牌的,具體實現(xiàn)可以參考TokenProcessor類中的generateToken()方法?! ?

1. //驗證事務(wù)控制令牌,﹤html:form ﹥會自動根據(jù)session中標(biāo)識生成一個隱含input代表令牌,防止兩次提交

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.    }  


在更新的時候防止表單按鈕重復(fù)點擊,主要是用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.  

五.也可以通過添加中轉(zhuǎn)頁面的方式

對于JSP入門的角度講,可以通過添加中轉(zhuǎn)頁面的方式,這樣做雖然在視覺上不是很好,頁面間顯繁瑣,但是這是有效地避免Form表單重復(fù)提交的好方式。


 

【編輯推薦】

  1. 使用JSP include機(jī)制改進(jìn)外觀
  2. JSP編程應(yīng)注意的六個常見問題
  3. JSP教程基礎(chǔ)之腳本的使用
  4. JSP頁面Tomcat提高性能之王道
  5. 什么是JSP以及其強(qiáng)弱勢
責(zé)任編輯:仲衡 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2013-11-13 14:39:53

表單提交開發(fā)

2013-11-13 11:01:14

表單表單重復(fù)提交表單策略

2009-07-03 13:24:56

JSP表單

2009-12-01 18:11:03

PHP表單重復(fù)提交

2009-11-17 11:30:31

PHP表單

2009-07-29 16:40:50

Ajax提交asp.n

2011-07-18 09:48:10

jQuery

2010-11-23 16:56:04

mysql表單

2009-06-30 11:18:16

HTML表單JSP教程

2009-07-03 14:41:03

2010-01-22 14:59:40

VB.NET表單自動提

2009-06-30 14:27:02

JSP入門

2024-05-28 09:26:46

2009-03-17 16:18:51

JspActionStruts

2009-06-05 10:37:52

struts2 國際化表單

2009-07-07 14:33:44

JSP入門

2010-09-07 15:31:21

DIV CSS表單

2011-06-20 16:04:29

SEO

2021-08-04 07:47:17

表單組件代碼

2009-07-02 15:12:39

點贊
收藏

51CTO技術(shù)棧公眾號