Struts2防止表单重复提交的配置教程

需积分: 4 7 下载量 34 浏览量 更新于2024-10-05 收藏 64KB DOC 举报
"防止Action重复提交的配置方法" 在Web应用程序开发中,特别是使用Struts框架时,确保Action不被重复提交是一项重要的任务。重复提交可能导致数据不一致性和安全问题。Struts2提供了一种内置机制来处理这个问题,即使用Token Interceptor(令牌拦截器)。以下是如何使用Struts2防止表单重复提交的详细步骤和原理。 1. **引入<s:token>标签** 在提交表单的JSP页面中,你需要在`<form>`标签内部添加 `<s:token/>` 标签。这会在表单中生成一个唯一的标识符,用于跟踪用户的请求。例如: ```jsp <form name="myname" action="myaction.do" method="post"> <input type="text" name="stuName" value=""/> <s:token/> <input type="button" onclick="mymethod(this.form);"/> </form> ``` 这个`<s:token/>`标签会生成一个隐藏的输入字段,携带一个唯一的ID,这个ID在每次请求时都是不同的。 2. **配置拦截器** 在Struts的配置文件(通常是`struts.xml`)中,你需要为对应的Action添加一个名为`token`的拦截器引用。例如: ```xml <action name="Save" class="com.yourcom.app.Action.Dataform.saveAction" method="Save"> <interceptor-ref name="defaultStack"/> <interceptor-ref name="token"/> <result name="invalid.token">/Info/NoBack.jsp</result> </action> ``` 这里的`<interceptor-ref name="token"/>`表示启用Token拦截器,它会检查每个请求的令牌是否与上次提交的令牌相同。如果相同,那么就认为这是一个重复的提交,并返回`invalid.token`的结果。 3. **处理无效令牌** 当用户尝试重复提交时,由于令牌已经被验证过,拦截器会捕获到这个情况,并将控制权传递给配置的`invalid.token`结果,通常是一个提示页面,如`NoBack.jsp`。在这个页面上,你可以显示一条消息告知用户表单已提交,不应再次提交。 4. **工作原理** Struts2的Token Interceptor的工作原理是:当用户首次提交表单时,会生成一个唯一的令牌并存储在session中。当用户再次提交表单时,拦截器会检查这个令牌是否已经存在于session中。如果存在,说明是重复提交,于是返回错误结果;如果不存在,说明是新请求,允许提交并更新session中的令牌。 通过以上配置,你可以有效地防止用户的表单数据被意外或恶意地重复提交,从而保护了系统的数据一致性。同时,这也是一种防止跨站请求伪造(CSRF)攻击的简单方法,因为每个令牌都是与特定会话关联的,只有拥有正确令牌的请求才会被接受。