日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
JSP入門(mén)之避免Form表單重復(fù)提交的幾種方案

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

目前創(chuàng)新互聯(lián)公司已為上千余家的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、港南網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

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

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

 
 
 
  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();"﹥  

二. 對(duì)于JSP人門(mén)還要掌握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入門(mén)階段也要注意善于利用STRUTS的同步令牌機(jī)制 
 
  利用同步令牌(Token)機(jī)制來(lái)解決Web應(yīng)用中重復(fù)Form表單提交的問(wèn)題,Struts也給出了一個(gè)參考實(shí)現(xiàn)。

  基本原理: 

  服務(wù)器端在處理到達(dá)的請(qǐng)求之前,會(huì)將請(qǐng)求中包含的令牌值與保存在當(dāng)前用戶會(huì)話中的令牌值進(jìn)行比較,看是否匹配。在處理完該請(qǐng)求后,且在答復(fù)發(fā)送給客戶端之前,將會(huì)產(chǎn)生一個(gè)新的令牌,該令牌除傳給客戶端以外,也會(huì)將用戶會(huì)話中保存的舊的令牌進(jìn)行替換。這樣如果用戶回退到剛才的提交頁(yè)面并再次提交的話,客戶端傳過(guò)來(lái)的令牌就和服務(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ù)用戶會(huì)話ID和當(dāng)前系統(tǒng)時(shí)間來(lái)生成一個(gè)唯一(對(duì)于每個(gè)會(huì)話)令牌的,具體實(shí)現(xiàn)可以參考TokenProcessor類中的generateToken()方法?! ?

1. //驗(yàn)證事務(wù)控制令牌,﹤html:form ﹥會(huì)自動(dòng)根據(jù)session中標(biāo)識(shí)生成一個(gè)隱含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有這樣的一個(gè)方法生成令牌 

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

在更新的時(shí)候防止表單按鈕重復(fù)點(diǎn)擊,主要是用Session來(lái)做判斷

四.在JSP入門(mén)時(shí)還要掌握頁(yè)面方式

 
 
 
  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.  

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

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


當(dāng)前題目:JSP入門(mén)之避免Form表單重復(fù)提交的幾種方案
文章路徑:http://www.dlmjj.cn/article/dpeojdh.html