JSP(Struts)避免Form重复提交的几种方案

固安蕴铭

固安蕴铭

2016-02-19 18:07

今天图老师小编给大家展示的是JSP(Struts)避免Form重复提交的几种方案,精心挑选的内容希望大家多多支持、多多分享,喜欢就赶紧get哦!

  1 javascript ,设置一个变量,只允许提交一次。 
  script language="javascript"
   var checkSubmitFlg = false;
   function checkSubmit() {
   if (checkSubmitFlg == true) {
   return false;
   }
   checkSubmitFlg = true;
   return true;
   }
   document.ondblclick = function docondblclick() {
   window.event.returnValue = false;
   }
   document.onclick = function doconclick() {
   if (checkSubmitFlg) {
   window.event.returnValue = false;
   }
   }
  /script
  
  html:form action="myAction.do" method="post" onsubmit="return checkSubmit();"  
  2 还是javascript,将提交按钮或者image置为disable  
   html:form action="myAction.do" method="post"
   onsubmit="getElById('submitInput').disabled = true; return true;"   
   html:image styleId="submitInput" src="images/ok_b.gif" border="0" / 
   /html:form  
  3 利用struts的同步令牌机制  
  利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。
  基本原理: 
  服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。 
  if (isTokenValid(request, true)) {
   // your code here
   return mapping.findForward("success");
  } else {
   saveToken(request);
   return mapping.findForward("submitagain");
  } 
  Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。  
  1. //验证事务控制令牌,html:form 会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
  2. 在action中:  
   //input type="hidden" name="org.apache.struts.taglib.html.TOKEN"
   // value="6aa35341f25184fd996c4c918255c3ae"
   if (!isTokenValid(request))
  errors.add(ActionErrors.GLOBAL_ERROR,
   new ActionError("error.transaction.token"));
   resetToken(request); //删除session中的令牌  
  3. action有这样的一个方法生成令牌  
   protected String generateToken(HttpServletRequest request) {  
   HttpSession session = request.getSession();
   try {
   byte id[] = session.getId().getBytes();
   byte now[] =
   new Long(System.currentTimeMillis()).toString().getBytes();
   MessageDigest md = MessageDigest.getInstance("MD5");
   md.update(id);
   md.update(now);
   return (toHex(md.digest()));
   } catch (IllegalStateException e) {
   return (null);
   } catch (NoSuchAlgorithmException e) {
   return (null);
   }
   }
   
  在更新的时候防止按钮重复点击,主要是用Session来做判断
  在JSP/Servlet中可以
  JSP页面
  input type="hidden " name=" % =com.lims.util.SynchroToken.TOKEN_NAME% " value =" %= com.lims.util.SynchroToken.getToken(request)%"  

  SynchroToken.java
  package com.lims.util;
  import org.apache.struts.util.*;
  import javax.servlet.http.*;
  import javax.servlet.jsp.*;
  import org.apache.struts.action.*;
  /**
    * pTitle: SynchroToken /p
    * pDescription: /p
    * pCopyright: Copyright (c) 2004/p
    * pCompany: NetStar/p
    * @author Jstar
    * @version 1.0
    * Created in 2004/04/21
    */
  public class SynchroToken{
   public final static java.lang.String TOKEN_NAME = "_token";
   public static boolean checkToken (HttpServletRequest request){
     boolean isEqual = false;
     HttpSession session = request.getSession ();
     String formToken = request.getParameter (TOKEN_NAME);
     String sessionToken = (String)session.getAttribute (TOKEN_NAME);
     System.out.println ("formToken: " + formToken + " sessionToken: " +
                         sessionToken);
     if (formToken != null && sessionToken == null){
       session.setAttribute (TOKEN_NAME, formToken);
       isEqual = true;
     }
     return isEqual;
   }
   /**
    * Insert the method's description here.
    * Creation date: (4/19/2004 3:23:25 PM)
    * @return java.lang.String
    * @param request javax.servlet.http.HttpServletRequest
    */
   public static String getToken (HttpServletRequest request){
     String token = "" + System.currentTimeMillis ();
     HttpSession session = request.getSession ();
     if (session != null){
       session.removeAttribute (TOKEN_NAME);
     }
     return token;z
   }
   /**
    * Insert the method's description here.
    * Creation date: (4/19/2004 3:24:10 PM)
    * @return java.lang.String
    */
   final static java.lang.String getTOKEN_NAME (){
     return TOKEN_NAME;
   }
   public static String message (PageContext pageContext, String key) throws
       JspException{
     return RequestUtils.message (pageContext, null, null, key);
   }
  }

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)

  4 添加中转页面
  http://blog.csdn.net/loveyou1999/archive/2007/02/02/1501295.aspx

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/webkaifa/)
展开更多 50%)
分享

猜你喜欢

JSP(Struts)避免Form重复提交的几种方案

Web开发
JSP(Struts)避免Form重复提交的几种方案

JSP避免Form重复提交的三种方案

Java JAVA基础
JSP避免Form重复提交的三种方案

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

JavaScript中避免Form重复提交的两种方案

Web开发
JavaScript中避免Form重复提交的两种方案

jsp 重复提交问题

Web开发
jsp 重复提交问题

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

AJAX避免用户重复提交请求实现方案

Web开发
AJAX避免用户重复提交请求实现方案

如何避免表单的重复提交

PHP
如何避免表单的重复提交

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

VC连接SQL SERVER数据库

VC连接SQL SERVER数据库

JSP编写WAP输入中文乱码问题

JSP编写WAP输入中文乱码问题
下拉加载更多内容 ↓