前阵子弄了些表单防重复提交的东西,想整理整理,免得下次要用时再四处去找,其实这里的东西还是挺简单的。
原理:
在Session中保存一个表单的唯一编号,将该编号放在一个隐藏域中,同其他数据一同提交。在提交表单后,通过拦截器或其他机制检查唯一编号,如果存在则说明表单是第一次提交,如果不存在则被重复提交(理由很简单,在第一次提交检查后就会从Session中移除该编号)。保存编号可以用一个 HashMap。
上代码:
表单类,用于保存表单创建时间和表单的标示
表单管理器接口
表单管理器接口实现
Spring中的拦截器实现
在Spring MVC的HandlerMapping中配置该拦截器,随后在需要表单验证的Controller里做如下修改:
1、注入FormManager实例,主要是用newForm()生成一个新的Form对象
2、在返回的ModelAndView里加入该Form对象,假设名称是form
3、页面的表单中加入如下隐藏域
代码中我去掉了些东西,应该还是能正常工作的,反正原理就是这么回事,呵呵。