当某些特定的场景下,如网络延迟时,用户可能会重复提交信息,需要用一种机制来防止这种情况.
struts2防重复提交是基于拦截器的.
1.模拟重复提交场景
1)jsp文件
<s:form action="studentAction" method="post">
<s:textfield name="studentName" label="学生姓名"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
2)struts.xml配置
<action name="studentAction" method="add" class="com.skymr.struts2.chapter5.action.StudentAction">
<result name="success">/regSuc.jsp</result>
</action>
3)Action类
public class StudentAction extends ActionSupport {
public String add(){
System.out.println("添加学生中");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
System.out.println("添加完成");
return SUCCESS;
}
}
4)测试
添加学生中
添加完成
添加学生中
添加完成
因为在Action类中休眠了5秒钟,当点击了提交按钮后,不会马上返回,可以再次点击提交,但后台显示调用了两次.
2.<s:token>标签防重复提交
<s:actionerror/>
<s:form action="studentAction" method="post">
<s:token></s:token>
<s:textfield name="studentName" label="学生姓名"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
jsp文件中添加了token标签,这个标签要放在form里.
<action name="studentAction" method="add" class="com.skymr.struts2.chapter5.action.StudentAction">
<result name="success">/regSuc.jsp</result>
<result name="invalid.token">/student_add.jsp</result>
<interceptor-ref name="token"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
配置invalid.token的result和使用token拦截器.这种方法有个缺点,就是重复提交时会跳转到一个页面显示错误信息.
3.tokenSession配置防重复提交
<s:form action="studentAction" method="post">
<s:token></s:token>
<s:textfield name="studentName" label="学生姓名"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
<action name="studentAction" method="add" class="com.skymr.struts2.chapter5.action.StudentAction">
<result name="success">/regSuc.jsp</result>
<interceptor-ref name="tokenSession"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
这种方式比较好,直接忽略重复提交.