在有些情况,比如网络延迟,服务器延迟等使得在提交数据时有延迟,用户可能会相同数据提交多次,就会出现重复提交。
Struts提供了防止重复提交的机制。
1.使用<s:token/>标签防重复提交
2.使用 tokenSession 拦截器防重复提交
模拟重复提交的实例
模拟学生添加过程。
新建Student实体,属性:name,age 生成get set,以及toString
新建StudentAction:
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 super.execute();
}
}
配置status.xml:
<struts>
<package name="student" extends="struts-default">
<action name="addStu" method="add" class="com.java.action.StudentAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
界面:
<body>
<s:form action="addStu" method="post">
<s:textfield name="student.name" label="姓名"></s:textfield>
<s:textfield name="student.age" label="年龄"></s:textfield>
<s:submit value="添加"></s:submit>
</s:form>
</body>
使用<s:token/>标签防重复提交
<s:token></s:token> :加在 form 里;
使用 token 拦截器:
<interceptor-ref name="token"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref>
<result name="invalid.token">/student.jsp</result> :在 struts.xml 里配置,假如出现重复提 交,则直接回到页面; <s:actionerror/>:在页面上显示错误信息;
<s:form action="addStu" method="post">
<s:token></s:token>
<s:textfield name="student.name" label="姓名"></s:textfield>
<s:textfield name="student.age" label="年龄"></s:textfield>
<s:submit value="添加"></s:submit>
<s:actionerror/>
</s:form>
<struts>
<package name="student" extends="struts-default">
<action name="addStu" method="add" class="com.java.action.StudentAction">
<result name="success">/success.jsp</result>
<result name="invalid.token">/studentadd.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>
当重复提交时:
使用 tokenSession 拦截器防重复提交
上面的那种方法不人性化,我们的需求应该是:当用户重复提交时:底层应该忽略掉重复提交的数据:
tokenSesssion 拦截器直接无视重复提交的请求;
<interceptor-refname="tokenSession"></interceptor-ref>
<interceptor-refname="defaultStack"></interceptor-ref>
改一下:
<struts>
<package name="student" extends="struts-default">
<action name="addStu" method="add" class="com.java.action.StudentAction">
<result name="success">/success.jsp</result>
<!-- <result name="invalid.token">/studentadd.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>
这样,当用户重复提交时,会自动忽略掉重复提交的数据。