在之前的工作和学习中总是会遇到表单重复提交的问题,使用了网上的各种解决方法 js,禁用提交按钮,阻止用户后退等操作,但是效果总有一些欠缺。在这里参考了某位老师的意见,决定使用session和自定义表单的形式进行解决。
1、实现思路:
在页面存放一个含有唯一值key value对将其存放在session(这里采用jsp自定义标签的方式进行实现,避免在jsp页面中写很多的java脚本 导致页面混乱)
在提交表单时,后台的处理逻辑获取request中的session 并去取出其中指定的值,第一次获取对应的值后就将其对应的值设置为null,则用户无论以(刷新,后退,重新)等方式进行再次提交。则第二次或者多次提交到后台获取的数据为null时,则判断为重复提交。
2、jsp自定义标签的原理
3、编写jsp的自定义标签
继承SimplTagSupport类,并重新覆盖其中的doTag对象,在其中获取session,并设置唯一的key-value对
<code>
/**
* 防止表单重复提交的jsp标签类
* @author xieqx
*
*/
public class TokenTag extends SimpleTagSupport{
//在调用方法之前,该类对象已经被注入了PageContext(可以从其中获取session)
//该对象由setJspContext()方法调用 返回JspContext (其实返回的真实类型为PageContext
//JspContext 其实为PageContext的父类)
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext)getJspContext(); //获取jsp的九大域对象
HttpSession session = pageContext.getSession();
session.setAttribute("token", UUID.randomUUID().toString());
}
}