struts2学习(15)struts2防重复提交

Posted 有点懒惰的大青年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>

测试:

前台显示添加成功:

查看后台:

 

 

 

以上是关于struts2学习(15)struts2防重复提交的主要内容,如果未能解决你的问题,请参考以下文章

Struts2系列:(13)防表单重复提交(token + 拦截器)

关于struts2防止表单重复提交

[原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

Struts2学习4——防sql注入过滤器

struts2学习1

struts2防止表单重复提交的解决方案