基本原理:
服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
找一般的流程中插入个中间的action
多写一个action如nonoaction
在nonoaction中 this.saveToken(request); //设置指令牌 return 跳转到执行逻辑功能的action中如doaction |
执行业务功能的action 如doaction
在doaction中 ...... if(this.isTokenValid(request)) //如果指令牌相同 {..... ...实现功能的代码 this.resetToken(request);//取消指令牌 }else //执行else说明提交是重复提交 { 可以跳转回首页.并报错 如写 ActionMessages errors= new ActionMessagers(); errors.add(“token”,new ActionMessages(“token”)); //可以把错误信息写在资源文件中 然后显示 this.saveErrors(return.errors); //保持错误信息 跳转…. }
|