Struts 防重复提交

场景:

系统比较繁忙,存在延时

模拟延迟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>

 

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>

 

测试:

两次点击提交

二、使用<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;

    }

 

}

 

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>

 

测试:

前台显示添加成功

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40135955/article/details/89139270