使用token可以解决重复提交问题,这里的重复提交一个指的是可能连续点击提交按钮,从而导致同一表单的重复提交。另外一种情况指的是提交成功后点击后退,退回到刚才的页面,继续提交。下面以一个注册用户的页面为例。
首先在跳转到需要提交的表单页面之前必须先创建令牌。即必须在跳转到该页面之前执行saveToken(request)。例如,可以在跳转到注册页面前的ActionServlet中创建令牌,并且saveToken(request)方法同时将令牌保存在了当前session中(beforeResisterAction是跳转到注册页面前的Action):
public beforeRegisterAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {
this.saveToken(request);
return new ActionForward("register.jsp");
}
}
然后在跳转到register.jsp页面时,需要使用html自带的标签<html:form>才可,可以在改页面的源码中看到
<input type="hidden" name="org.apache.struts.taglib.html.TOKEN"value="6164b68f90b167bdb952be7b5bc833be">html:form标签自动给你生成的一行,这个value即为在beforeRegisterAction中struts根据当前时间生成的一个令牌值,在注册页面提交时,该令牌值也一起提交到后台处理程序:
public class RegisterAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)throws Exception {
//isTokenValid(request)方法是验证令牌有效性的方法,通过把session中的令牌值和刚才在注册表单中一起提交的令牌值进行比较来验证令牌是否正确
if(!isTokenValid(request)){
//如果无效的话则重新设置令牌,可以进行自己的逻辑处理
。。。。。。。。
this.saveToken(request);
return (new ActionForward(mapping.getInput()));
}else{
//如果令牌有效的话,需要先将令牌重置,然后下面接着自己的逻辑处理即可
resetToken(request);
}
。。。。。。。。。。。
}
以上即简单的演示了token的是使用过程。