96 views

Struts 防止表单重复提交

最近开发中碰到了一个重复提交表单的问题,这应该这个非常危险的问题,可能会造成数据库增加大量数据,看了几种解决办法,有用JS提交后将button改为disable的,这其实并没有解决,特别是网络不流畅情况下,也有用cookie的,这里介绍一下Struts的Token机制,基本原理:服务器端在处理到达的请求之前,会将请求中包含的Token值与保存在当前用户会话中的Token值进行比较,看是否匹配,在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的Token,该Token除传给客户端以外,也会将用户会话中保存的旧的Token进行替换,这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的Token就和服务器端的不一致,从而有效地防止了重复提交的发生。

上代码:

在form里加一个值,它会生成一个隐藏域用于存储系统自动随机生成的Token值。

<s:token></s:token>

在struts.xml里对应的action里加一个result和两个拦截器:

<result name="invalid.token">xxx.jsp</result> 
<interceptor-ref name="token"></interceptor-ref> 
<interceptor-ref name="defaultStack"></interceptor-ref>

这样用户如果重复提交,便会跳转到xxx.jsp,在xxx中加入<s:actionerror />,会提示The form has already been processed or no token was supplied, please try again,

如果想显示中文请在国际化文件中加入struts.messages.invalid.token=请勿重新提交表单..。

无觅相关文章插件,快速提升流量

Struts 防止表单重复提交》上有 2 条评论

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>