最近开发中碰到了一个重复提交表单的问题,这应该这个非常危险的问题,可能会造成数据库增加大量数据,看了几种解决办法,有用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>
<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=请勿重新提交表单..。
博客肿么弄了个这样的主题~~
单栏嘛…挺好的