Struts2_18_Struts防止重复提交

在有些情况,比如网络延迟,服务器延迟等使得在提交数据时有延迟,用户可能会相同数据提交多次,就会出现重复提交。

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>

这样,当用户重复提交时,会自动忽略掉重复提交的数据。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值