精华内容
下载资源
问答
  • 论银行支付接口与防止刷新重复提交表单之间的提示关系

    一个很老的话题了,在提交了一个form的数据后,怎样才能防止用户直接刷新提示界面来重复提交数据呢,大至上有两个很简单的方式达到目的。

    方法一、form提交处理完后用Response.Redirect跳转一下页面,使得用户无法直接刷新到form提交后的页面,这种方式麻烦就是,你想保持提交前的页面状态的话,要作需要数据接替操作,作起来相当麻烦,我用这个方法时一向都是强制丢起所有页面状态,无奈,人懒没药医。


    方法二、将form的所有数据加起来然后Md5一下,存在session里,下次收到数据在处理前也将所有相同的数据加起来Md5一下,对比session里的数据,如果一样就表示是重复提交,拒绝操作。防止用户手动把两次form值都填一下而无法提交,可以加一个当前时间的hidden来判定一下,是手动提交还是刷新提交就完美了。


    以前一直在用方法一,导致页面状态,要不很麻烦的处理要不懒得处理导致很简单的界面用户操作起来相当繁琐。要不就是让用户随便刷新重提。最新一直在作着银行支付接口一直在搞密匙,作到这种界面时,突然想到,银行支付接口靠md5保证数据的完整性及安全性,为啥不能用md5来验证一下提交过来的form数据是否与上一次的相同呢?还能节省session占的内存数,然后方法二就诞生了。并发个blog记录一下,防止什么时候脑子一短路又把这方法给忘了,又回到页面状态保持困难的地狱里去。

    展开全文
  • 1,在进入jsp页面之前,先在servlet中产生一个随机值,放入sesstion中  2,然后进入jsp页面,在页面中加入hidden... 3,提交form之后,在servlet中做判断:  1》,jsp页面中的属性不为空;  2》,在session中

               1,在进入jsp页面之前,先在servlet中产生一个随机值,放入sesstion中

               2,然后进入jsp页面,在页面中加入hidden类型的值,用el取出servlet中产生的值

               3,提交form之后,在servlet中做判断:

                   1》,jsp页面中的属性不为空;

                   2》,在session中的属性不为空;

                   3》,比较jsp页面中的值和session中的值是否相同,如果相同,做该做的处理,从session中移除这个属性;

                   4》,不满足以上3 点的都不做处理;



    参考:

    http://www.cnblogs.com/xdp-gacl/p/3859416.html

    展开全文
  • 一次提交后把表单清空,在后台逻辑上进行判断,从而区分是否重复提交以上两点为理论,最后解决是通过form表单提交后直接重定向到相同的url,实现页面刷新且展示提交数据的 即: 提交后执行页面重定向,这就是所谓的...
    1. 直接让表单按钮失效,从而保证一个用户对于一个表单只能提交一次
    2. 一次提交后把表单清空,在后台逻辑上进行判断,从而区分是否重复提交

      以上两点为理论,最后解决是通过form表单提交后直接重定向到相同的url,实现页面刷新且展示提交数据的

    即:

    • 提交后执行页面重定向,这就是所谓的Post-Redirect-Get
      (PRG)模式。简言之,当用户提交了表单后,你去执行一个客户端的重定向,转到提交成功信息页面

    php中重定向

    return $this->redirect("/index/XXX(控制器)/XXX(方法名)?a=&b=&c=");
    
    //例如
    return $this->redirect("/index/hello/sayhello?type=".$type."&info=".$info."&tag=".$tag);
    
    //重定向跳转页面生成url为
    http://www.XXX.com/index/hello/sayhello?type=yes&info=hello&tag=1
    
    展开全文
  • struts2 国际化与防止刷新重复提交表单 本实例主要是功能是实现国际化,防止刷新得利提交表单,利用struts2的验证机制验证字符输入的合法性,邮箱输入的正确性:本实例用两个页面(create.jsp,createResult.jsp),一个...
                struts2 国际化与防止刷新重复提交表单
        本实例主要是功能是实现国际化,防止刷新得利提交表单,利用struts2的验证机制验证字符输入的合法性,邮箱输入的正确性:
    本实例用两个页面(create.jsp,createResult.jsp),一个Action(CreateAction),一个验证文件(CreateAction-validation.xml),两个国际化文件(message_en_US.properties,message_zh_CN.properties),还有一个struts.xml(必有的).创建用户成功之后,显示刚才创建的信息,不成功则显示错误提示,错误提示使用
    了国际化来显示,输入合法性就用了用struts2的验证机制验证.
    如下结构图,好好对照:

    K:/ECLIPSWORKS/STRUTS2TEST
    │  .classpath
    │  .mymetadata
    │  .project

    ├─.myeclipse
    ├─src
    │  │  message_en_US.properties
    │  │  message_zh_CN.properties
    │  │  struts.xml
    │  │
    │  └─cn
    │      └─struts2
    │              CreateAction-validation.xml
    │              CreateAction.java

    └─WebRoot
        │  create.jsp
        │  createResult.jsp
        │
        ├─META-INF
        │      MANIFEST.MF
        │
        └─WEB-INF
            │  web.xml
            │
            ├─classes
            │  │  message_en_US.properties
            │  │  message_zh_CN.properties
            │  │  struts.xml
            │  │
            │  └─cn
            │      └─struts2
            │              CreateAction-validation.xml
            │              CreateAction.class
            │
            └─lib
                                   
                    commons-logging-1.0.4.jar
                    freemarker-2.3.8.jar
                    jcommon-1.0.14.jar
                    junit.jar
                    ognl-2.6.11.jar
                    struts2-core-2.0.11.2.jar
                    struts2-jfreechart-plugin-2.0.11.2.jar
                    xwork-2.0.5.jar






    1.CreateAction.java
    // ******************************************************************
    package cn.struts2;

    import java.util.Date;

    import com.opensymphony.xwork2.ActionSupport;

    public class CreateAction extends ActionSupport
    {
        private String name ;
        private String password;
        private String repassword;
        private Date birthday;
        private Date registedDay;
        private int age;
        private String email;
        
        /**
         * @return the name
         */
        public String getName()
        {
            return name;
        }
        /**
         * @param name the name to set
         */
        public void setName(String name)
        {
            this.name = name;
        }
        /**
         * @return the password
         */
        public String getPassword()
        {
            return password;
        }
        /**
         * @param password the password to set
         */
        public void setPassword(String password)
        {
            this.password = password;
        }
        /**
         * @return the repassword
         */
        public String getRepassword()
        {
            return repassword;
        }
        /**
         * @param repassword the repassword to set
         */
        public void setRepassword(String repassword)
        {
            this.repassword = repassword;
        }
        /**
         * @return the birthday
         */
        public Date getBirthday()
        {
            return birthday;
        }
        /**
         * @param birthday the birthday to set
         */
        public void setBirthday(Date birthday)
        {
            this.birthday = birthday;
        }
        /**
         * @return the registedDay
         */
        public Date getRegistedDay()
        {
            return registedDay;
        }
        /**
         * @param registedDay the registedDay to set
         */
        public void setRegistedDay(Date registedDay)
        {
            this.registedDay = registedDay;
        }
        /**
         * @return the age
         */
        public int getAge()
        {
            return age;
        }
        /**
         * @param age the age to set
         */
        public void setAge(int age)
        {
            this.age = age;
        }
        
        public String getEmail()
        {
            return email;
        }
        public void setEmail(String email)
        {
            this.email = email;
        }
        //****************************************
        
        public String execute()throws Exception
        {
            return SUCCESS;
        }
        
    }

    //******************************************************************



    2.置全局国际化文件(两个):
    // message_en_US.properties ********************************************
    create = Create Users Information
    username.invalid = User Name Not Null!
    password.invalid.null = Password Not Null!
    password.invalid.too.short.or.long = Password should be between 6 and 10
    submit = submit
    //***********************************************************************
    中文国际化
    // message_zh_CN.properties ********************************************
    create = /u521b/u5efa/u7528/u6237/u4fe1/u606f
    username.invalid = /u7528/u6237/u540d/u4e0d/u80fd/u4e3a/u7a7a
    password.invalid.null = /u5bc6/u7801/u4e0d/u80fd/u4e3a/u7a7a
    password.invalid.too.short.or.long = /u5bc6/u7801/u957f/u5ea6/u5fc5/u987b/u57286/u523010/u4e4b/u95f4
    submit =/u63d0/u4ea4

    //***********************************************************************
    注意:如(create = /u521b/u5efa/u7528/u6237/u4fe1/u606f)等号右边的一串乱码是中文字符对就的ASCII码值,如果你需要转换,可以打开你的CMD(开始-->运行-->输入CMD即可),输入命令native2ascii,回车,将你的中文字符粘上,再回车就可以看到一串乱码了.再将其COPY到相应的位置即可.
    文件的名字不能乱取,XXX_en_US.properties,XXX_zh_CN.properties,XXX后面的名字是固定的,而前面的XXX是根据你的struts.xml文件中的 <constant name="struts.custom.i18n.resources" value="XXX"></constant>中的XXX而取的.本例的XXX就是message.

    3.struts.xml
    //  ************************************************************************
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">


    <struts>
       <constant name="struts.custom.i18n.resources" value="message"></constant>
        
       <package name="struts2" extends="struts-default">

            <action name="create" class="cn.struts2.CreateAction" >
            <result name="success">/createResult.jsp</result>
            <result name="input">/create.jsp</result>
            
            <!-- avoid refresh again -->
            
            <interceptor-ref name="token"></interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <result name="invalid.token">/create.jsp</result>            
            
           </action>

      </package>
    </struts>

    //************************************************************************

    4.web.xml  
    // ****************************************************************
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.4"
        xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
     
     
      <filter>
          <filter-name>struts2</filter-name>
          <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
      </filter>
     
      <filter-mapping>
          <filter-name>struts2</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>
     
       
    </web-app>

    //*************************************************************************

    5.JSP文件
    (1)
    // createResult.jsp ************************************************************************

    <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title> luanmad's JSP page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is luanmad's JSP page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->

      </head>
     
      <body>
        User Name:${requestScope.name }<br>
        Password :${requestScope.password }<br>
        Age:<s:property value="age"/><br>
        Birthday:<s:property value="birthday"/><br>
        RegistedDay:<s:property value="registedDay"/><br>
        Email:<s:property value="email"/><br>
        
      </body>
    </html>

    //***********************************************************************

    (2) 
    // create.jsp *******************************************************************

    <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
    <%
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://"
                + request.getServerName() + ":" + request.getServerPort()
                + path + "/";
    %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
        <head>
            <base href="<%=basePath%>">

            <title>luanmad's JSP page</title>

            <meta http-equiv="pragma" content="no-cache">
            <meta http-equiv="cache-control" content="no-cache">
            <meta http-equiv="expires" content="0">
            <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
            <meta http-equiv="description" content="This is luanmad's JSP page ">
            <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->

        </head>

        <body>
                    
            <s:form action="create" method="post">
                <!-- 防止刷新重复提交-->
                <s:token></s:token>

                <s:textfield name="name" label="User Name"></s:textfield>
                <s:password name="password" label="Password"></s:password>
                <s:textfield name="age" label="Age"></s:textfield>
                <s:textfield name="birthday" label="Birthday"></s:textfield>
                <s:textfield name="registedDay" label="RegistedDay"></s:textfield>
                <s:textfield name="email" label="Email"></s:textfield>
                <s:submit key="submit"></s:submit>
                <s:reset label="reset"></s:reset>

            </s:form>
        </body>
    </html>
    //*******************************************************************

    6.验证文件(注意名字要与你的Action名字一样,后面再跟固定的(-validation.xml)如(CreateAction-validation.xml)

    CreateAction-validation.xml:
    // ****************************************************************************
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">

    <!-- 格式的写法可以参照XWork Validator 1.0.2.dtd -->
    <!-- 参数设置参照xwork-2.0.5.jar 下的com.opensymphony.xwork2.validator.validators/default.xml -->
    <validators>
       
       
        <!--验证谁, 用谁来验证 -->
        <field name="name">
            <field-validator type="requiredstring">
                <!--requiredstring对应的类的方法里的参数名trim 如public void setTrim(boolean trim)里的trim -->
                <param name="trim">true</param>
                <!-- message key的key内容是I18N里(即baseName_zh_CN.properties和baseName_en_US.properties中)定义的字段名即等号在边的名字如(username.invalid = 名字不能为空)-->
                <message key="username.invalid"></message>
            </field-validator>
        </field>
       
        <field name="password">
            <field-validator type="requiredstring">
                <param name="trim">true</param>
                <message key="password.invalid.null"></message>
            </field-validator>
        </field>
        <field name="password">
            <field-validator type="stringlength">
                <param name="minLength">6</param>
                <param name="maxLength">16</param>
                <message key="password.invalid.too.short.or.long"></message>
            </field-validator>
        </field>
       
        <!-- 以下未做国际化 -->
        <field name="age">
            <field-validator type="int">
                <param name="min">1</param>
                <param name="max">150</param>
                <message>age should be between ${min} and ${max}</message>
            </field-validator>
        </field>
       
        <field name="birthday">
            <field-validator type="required">
                <message>birthday not null!</message>
            </field-validator>
           
            <field-validator type="date">
                <param name="min">2000-01-01</param>
                <param name="max">2008-01-01</param>
                <message>birthday should be between ${min} and ${max}</message>
            </field-validator>
        </field>
       
        <field name="email">
            <field-validator type="email">
                <message>email format error!</message>
            </field-validator>
        </field>
       
    </validators>
    //*******************************************************************************************


    注意导入相应的包.

    展开全文
  • Struts2防刷新重复提交表单设置

    千次阅读 2012-05-26 23:53:08
    设置分为两步: 1. 修改Struts.xml配置(以名称为...对于以上的action,未加入防刷新机制时,按F5会重复提交表单。 对于以下修改后: /pages/MainPage.jsp /pages/MainPage.jsp   default
  • 网上根据session给方法结局方案: Step 1:首先我们在进入表单填写页面时,对该页面(或view吧)随机生成一个校验字符串并存放于Session中,在页面form中新增一个hidden input来存放,以便提交时一起POST到服务器端...
  • 防止页面刷新重复提交表单,经过我在网上查资料,并且尝试,我采用了一种办法,利用token标签和tokenSession,只需要修改两个地方就可以,一个是修改jsp页面,另一个就是修改struts.xml文件。 1.struts.xml文件...
  • 重复提交是我们开发中会常碰到的一个问题,除了我们使用js来防止表单重复提交,同时还可以使用php来防止重复提交哦。/** php中如何防止表单重复提交*/session_start();if (empty($_SESSION['ip'])) {//第一次...
  • 防止刷新或后退页面重复提交表单

    千次阅读 2017-11-06 17:56:08
    刷新或后退页面会引起重复提交表单,为了避免这个头疼的问题发生,有几种方法可以实现。网上已经有很多实现的方式的思路,比如提交后禁用按钮、重定向和令牌,但前两种方式有时候不起作用或者说没有“安全感”,我...
  • ASP.NET中防止刷新页面造成表单重复提交
  • 1、页面按 F5 刷新,避免表单重复提交的解决方法避免表单重复提交用户提交表单时可能因为网速的原因, 或者网页被恶意刷新, 致使同一条记录重复插入到数 据库中, 这是一个比较棘手的问题。 我们可以从客户端和...
  • 在制作通讯录私信功能过程中我发现提交一次表单后,只显示发送成功,要点击浏览器的刷新才会显示新的私信内容,而且会重复提交表单 但同时数据库会更新两条信息,再次刷新网页会出现两条一样的信息 会造成...
  • 最近在用Asp.Net编写点东西时遇到个问题:即用户在提交表单后按刷新就会重复提交数据,即所谓的“刷新重复提交”的问题。
  • 需要做一个页面定时刷新,但是asp.net页面使用window.location.reload() 会提示重复提交。 所以使用这个方法来做刷新功能 var form = document.getElementById('test_form'); form.submit(); 请直接提交表单。完美
  • 简易的防止恶意提交表单刷新页面重复提交,在没有禁止Cookie的情况下防止重启浏览器重复提交。 用Session设置令牌属性,提交后删除Session中的令牌。 Session记录上次提交的时间,短时间内无法重复提交。表单...
  • 产生原因:网络延时、重新刷新、点击浏览器的【后退】按钮回退到表单页面后...模拟程序使用验证码模拟请求识别验证码是非常难token+验证码使用 javascript 解决既然存在上述所说的表单重复提交问题,那么我们就要想...
  • javascript下阻止表单重复提交、防刷新、防后退
  • Struts2防止表单刷新重复提交

    千次阅读 2014-06-15 11:52:31
    防止表单重复提交主要用的到标签是,拦截器 interceptor-ref name="token" />,还有一个默认的返回值result name="invalid.token">/input.jspresult>  在页面加载时,产生一个GUID(Globally Unique ...
  • 防止重复提交表单

    2016-12-27 22:58:01
    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。 一、表单重复...
  • PHP防止刷新重复提交,通过不断刷新(Refresh or Reload)表单提交页面,可以重复提交表单内容,可以利用 PHP 的 Session 来避免这一点,Session 保存在服务器端,在 PHP 过程中改变 Session 变量的值后,即保存在...
  • 错误代码: 验证不通过的效果图: ...修改后若表单验证不通过刷新不会出现412错误。...异步提交表单时,只能用ajax提交,form标签里不能再写action与method,这些已经在ajax中定义过了,故不可再重复定义。...
  • 本文主要介绍在Session存储唯一标识Token,通过和后台对比,以实现防止刷新提交表单的问题。
  • 避免刷新页面时重复提交表单数据

    千次阅读 2018-09-18 14:37:57
    https://www.cnblogs.com/xdp-gacl/p/3859416.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,474
精华内容 8,989
关键字:

刷新重复提交表单