写一个简单的信息提交,如果没有重复提交,用户有时就会重复提交。
防重复提交步骤
1.<s:token></s:token>加到form里面
2.使用token拦截器
<interceptor-ref name="token"></interceptor-ref>
<!--因为使用了新的拦截器,所以原本自带的拦截器defaultStack被覆盖不能使用,要重新写-->
<interceptor-ref name="defaultStack"></interceptor-ref>
3.如果出现重复提交直接回到页面
<result name="invalid.token">/student.jsp</result>
4.在jsp页面写上,就可以在页面上返回错误信息
<s:actionerror/>
防重复提交实例一</s:token>
model-Student.java
package com.java.model;
public class Student {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
StudentAction.java
package com.java.action;
import com.java.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);
//模拟网络延迟,用户重复提交,往后5秒信息才提交
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="manager" extends="struts-default">
<action name="student" class="com.java.action.StudentAction" method="add">
<result name="success">/success.jsp</result>
<result name="invalid.token">/student.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<!--因为使用了新的拦截器,所以原本自带的拦截器defaultStack被覆盖不能使用,要重新写-->
<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></s:token>
姓名:<input type="text" name="student.name"/><br/>
年龄:<input type="text" name="student.age"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
信息form里面有<s:token></s:token>,每天提交信息放到session里然后到struts.xml里的拦截器判断是否重复提交
如果重复提交 <result name="invalid.token">/student.jsp</result>返回提交信息
最后通过<s:actionerror/>,显示提交信息
结果截图
防重复提交实例二tokenSession
上面代码不变修改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="manager" extends="struts-default">
<action name="student" class="com.java.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>
这样就不会返回重复信息提示给用户,但不管用户提交多少次,都提示提交成功,但系统只接收一次信息
结果:
第一次提交
第二次提交,还是显示提交成功
但是后台只打印一次,所以不管用户提交多少次。系统只保存一条相同的信息