1.Struts为了解决对某个请求不断地提交,采用token令牌机制。。
具体实现过程大概就是 客户端在提交请求的时候,顺便传送一个令牌值,这个值是根据session id 和当前时间long值计算出来,通过隐藏字段保存在页面中。。提交的时候,服务器也会产生一个token值,当提交之后,服务器在处理请求之前,先将这两个值进行比较,如果一致,那么OK,不是重复提交。并且在请求处理完返回客户端以前,也同样产生一个新的token值。服务器,客户端同时都保存这个toke值。如果当用户退回到刚开始的页面再次提交的时候,此时又产生一个新的token值,那么 跟服务器的token值就不一样了,所以就不能再提交被处理了。。有效的防止了 重复提交。。
用代码实现就是:在action中明确保存一下这个token值,然后再拿服务器端与客户端的值都比较一下。。做相应处理。
例如:以在数据库中插入一条数据来说明如何防止重复提交。
在Action中的add方法中,我们需要将Token值明确的要求保存在页面中,只需增加一条语句:saveToken(request);,如下所示:
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
//前面的处理省略
saveToken(request); //保存 token值。。
return mapping.findForward("add");
}
在Action的insert方法中,我们根据表单中的Token值与服务器端的Token值比较,如下所示:
public ActionForward insert(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
if (isTokenValid(request, true)) {
// 表单不是重复提交
//这里是保存数据的代码
} else {
//表单重复提交
saveToken(request);
//其它的处理代码
}
}
2.Struts2解决表单重复提交问题,提供了<s:token>这个表签
首先在客户端页面上写<s:struts>标签
然后 在Struts2的配置文件struts.xml中定义拦截器,如下:
<action.....>
<interceptor-ref name="token"/>
.....................
</action>
这个拦截器的实现原理也是一样的,当有请求的时候,也是先判断表单中的token值和当前会话session中的token值是不是一样,要是一样表明是第一次提交,否则是重复提交。。。。同样提交处理后,token值也做改变。。防止用户重复提交。。。
ps.学了这么久,竟然今天刚知道有这一点。。狠狠的被鄙视了一下子。。诶。。记住了!!!