zoukankan      html  css  js  c++  java
  • struts2学习(15)struts2防重复提交

    一、重复提交的例子:                          

    模拟一种情况,存在延时啊,系统比较繁忙啊啥的。
    模拟延迟5s钟,用户点了一次提交,又点了一次提交,例子中模拟这种情况;
    这样会造成重复提交;
     
    com.cy.action.StudentAction.java:
    package com.cy.action;
    
    import java.io.File;
    
    import org.apache.commons.io.FileUtils;
    
    import com.cy.model.Student;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class StudentAction extends ActionSupport{
        private static final long serialVersionUID = 1L;
        
        private Student student;
        
        public Student getStudent() {
            return student;
        }
    
        public void setStudent(Student student) {
            this.student = student;
        }
    
        public String add() throws Exception {
            System.out.println("开始添加学生:"+student);
            Thread.sleep(5000);
            System.out.println(student.getName()+"添加完成");
            return SUCCESS;
        }
    
    }

    struts.xml:

    <struts>
        
        <package name="manage" extends="struts-default">
            <action name="student" class="com.cy.action.StudentAction" method="add">
                <result name="success">/success.jsp</result>
            </action>
        </package>
        
    </struts>
    View Code

    student.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="student" method="post" >
        姓名:<input type="text" name="student.name"/><br/>
        年龄:<input type="text" name="student.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>
    View Code

    测试:

    二、使用<s:token/>标签防重复提交                                

     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>
        
        <package name="manage" extends="struts-default">
            <action name="student" class="com.cy.action.StudentAction" method="add">
                <result name="success">/success.jsp</result>
                <result name="invalid.token">/student.jsp</result>
                
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
        
    </struts>

    student.jsp修改为如下:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <!-- 重复提交的错误信息显示在这里 -->
    <s:actionerror/>
    
    <form action="student" method="post" >
        <!-- s:token的存在,让每次提交都有唯一的一个token令牌
             到了struts.xml中的<interceptor-ref name="token">token拦截器,就会识别
             比如说第一次提交的时候,肯定有一个标识记录在session里面,假如用户手贱又点了一次的话,
             form中token的值还是一样的,<interceptor-ref name="token">发现又来了这个玩意,肯定是重复提交。
             会返回一个<result name="invalid.token">,将错误信息返回到student.jsp里面。
         -->
        <s:token></s:token>
        姓名:<input type="text" name="student.name"/><br/>
        年龄:<input type="text" name="student.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    测试:

    填写姓名和年龄,点击两次提交,发现界面提示信息:

     而后台正常执行,只添加一条:

    上面有个不好的地方就是:将重复提交的错误信息,返回到界面了。
    但是有这种需求:将重复提交的忽略;无视重复提交的请求;

    三、使用tokenSession 拦截器防重复提交  -- 这种方式挺好的。                    

     

     com.cy.action.StudentAction.java:

    package com.cy.action;
    
    import com.cy.model.Student;
    import com.opensymphony.xwork2.ActionSupport;
    
    public class StudentAction extends ActionSupport{
        private static final long serialVersionUID = 1L;
        
        private Student student;
        
        public Student getStudent() {
            return student;
        }
    
        public void setStudent(Student student) {
            this.student = student;
        }
    
        public String add() throws Exception {
            System.out.println("开始添加学生:"+student);
            Thread.sleep(5000);
            System.out.println(student.getName()+"添加完成");
            return SUCCESS;
        }
    
    }
    View Code

    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>
        
        <package name="manage" extends="struts-default">
            <action name="student" class="com.cy.action.StudentAction" method="add">
                <result name="success">/success.jsp</result>
                
                <!-- <result name="invalid.token">/student.jsp</result>
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref> -->
                
                <interceptor-ref name="tokenSession"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </action>
        </package>
        
    </struts>

    student.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <form action="student" method="post" >
        <s:token></s:token>
        姓名:<input type="text" name="student.name"/><br/>
        年龄:<input type="text" name="student.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    </body>
    </html>

    测试:

    前台显示添加成功:

    查看后台:

     

  • 相关阅读:
    将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
    placeholder的兼容处理(jQuery下)
    滚动条滚动到页面底部继续加载的处理实例
    html/css基础篇——html代码编写过程中的几个警惕点
    多iframe使用tab标签方式添加、删除、切换的处理实例
    iframe的内容增高或缩减时设置其iframe的高度的处理方案
    IE9父容器overflow:auto时,子容器状态更改导致滚动条下出现额外空间的问题探讨
    C语言基本类型之long long int
    VIM使用技巧总结
    Ineedle驱动方式dpdk测试性能
  • 原文地址:https://www.cnblogs.com/tenWood/p/7105750.html
Copyright © 2011-2022 走看看