表单重复提交:
用户由于网速慢等原因..在提交了一个表单之后,在服务器响应之前,点击后退,回到表单后重复提交了表单
解决机制: 令牌机制
流程 用户点击注册链接-->后台servlet初始一个令牌,并记录在了服务器端,返回给用户一个带有令牌的隐藏表单域的表单-->用户提交--处理页面检查令牌
如果一致:重新生成服务端令牌,然后处理提交请求
如果不一致:确定是重复提交的表单,忽略请求并给用户一个出错提示
实现:
在显示注册表单之前的servelt中执行
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("add method invoked...");
this.saveToken(request);
return mapping.findForward("reg");
}
跳转到注册表单页面
接受表单请求的处理方法:
public ActionForward register(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
if(this.isTokenValid(request)){
this.resetToken(request);
return mapping.findForward("success");
}else{
return mapping.findForward("fail");
}
}
在html源代码中查看struts设置的token
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" value="df174bfe6ff75bf92960ecece89ce6a5"></div>