Struts2 实现防止表单重复提交的机制解析

需积分: 3 3 下载量 172 浏览量 更新于2024-09-16 收藏 45KB DOC 举报
"这篇文档是关于如何在Struts2框架中防止表单重复提交的原创内容,主要涉及Struts2的<s:token/>标签、拦截器以及错误处理机制。" 在Struts2框架中,防止表单重复提交是一个重要的功能,以避免用户意外或恶意地多次提交同一份表单数据,导致数据冗余或不一致。该文档提供了一个详细的方法来实现这一功能。 首先,使用Struts2的`s:token`标签是在页面的表单中插入一个隐藏的输入字段,这个标签会自动生成一个全局唯一的GUID值(全局唯一标识符)。在HTML代码中,`struts.token.name`是一个固定的属性,其值默认为"struts.token",而`struts.token`的值则是每次页面加载时随机生成的,确保每个表单提交都是独一无二的。 例如,在JSP页面中,你可能会看到如下代码: ```jsp <s:token name="myToken" /> ``` 这将生成类似于以下的HTML: ```html <input type="hidden" name="struts.token.name" value="struts.token"> <input type="hidden" name="struts.token" value="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"> ``` 这里的`name`属性可以自定义,如上述的"myToken",这样`struts.token`的名称就可以根据需要改变。 接下来,Struts2框架使用`<interceptor-ref name="token"/>`拦截器来检查表单提交。当表单被提交时,拦截器会对比请求中的token(来自用户提交的隐藏字段)与存储在用户会话(session)中的token。如果两者匹配,拦截器会删除会话中的token,并允许action继续执行;如果不匹配,表示可能有重复提交,拦截器会将错误信息添加到`actionErrors`中。 在配置文件中,通常会有如下设置来处理不匹配的情况: ```xml <result name="invalid.token">/input.jsp</result> ``` 这意味着当token验证失败时,系统会跳转到`/input.jsp`,让用户重新填写表单。 举例来说,一个简单的Action类可能如下所示: ```java package com.polaris.token; import com.opensymphony.xwork2.ActionSupport; public class TokenAction extends ActionSupport { private static final long serialVersionUID = 1L; private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } // 其他方法,如execute()等 } ``` 在这个Action类中,你可以处理token验证后的业务逻辑,比如数据持久化。当验证成功后,`execute()`方法会被调用,否则,由于拦截器添加了错误信息,Action的默认结果可能会返回到错误页面。 总结起来,Struts2通过`s:token`标签、`token`拦截器以及错误处理机制,提供了一套完整的解决方案来防止表单重复提交,保障了应用的正常运行和数据的准确无误。