表单已经提交,但是点击后退,显示网页过期,刷新后怎样避免重复提交(急!!谢谢!)

baiyunhe_001 2006-12-12 02:53:40
表单已经提交,但是点击后退,显示网页过期,刷新后怎样避免重复提交?
...全文
303 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
javamily 2006-12-12
  • 打赏
  • 举报
回复
学习中!!!!!!!!
fansy007 2006-12-12
  • 打赏
  • 举报
回复
protected boolean isTokenValid(javax.servlet.http.HttpServletRequest request)
Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.


protected void saveToken(javax.servlet.http.HttpServletRequest request)
Save a new transaction token in the user's current session, creating a new session if necessary.

protected void resetToken(javax.servlet.http.HttpServletRequest request)
Reset the saved transaction token in the user's session.


用org.apache.struts.action.Action类的以上3个方法来避免重复提交

待提交页面前面的action使用saveToken方法,提交后的action检查isTokenValid,如果为true,即提交正确,使用resetToken清掉token。




zxm_dgcstars 2006-12-12
  • 打赏
  • 举报
回复
利用struts的同步令牌机制

利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。

基本原理:

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

if (isTokenValid(request, true)) {

// your code here

return mapping.findForward("success");

} else {

saveToken(request);

return mapping.findForward("submitagain");

}

Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考TokenProcessor类中的generateToken()方法。
zlpei 2006-12-12
  • 打赏
  • 举报
回复
看代码

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧