Struts 的 Token (令牌)机制能够很好的解决表单重复提交的问题,基本原理是:服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,看是否匹配。在处理完该请求后,且在答复发送给 客户端之前,将会产生一个新的令牌,该令牌除传给客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次提交的 话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。
个人理解:用户在请求包含 token 标签的页面, struts 会计算出一个令牌值,并把它添加进 session ,同时把令牌值赋给 jsp 页面的隐藏域 struts.token, 当用户提交表单后,将请求包含的令牌值与 session 的令牌值比较,看是否匹配!同时产生新的令牌值,新令牌值覆盖 session 中的旧令牌值,如果用户回退到提交页面再提交,则 struts.token 的值与 session 中令牌值将不同,返回 invalid.token 结果。
用法:
第一步:在表单中加入 <s:token/> 标签
如:
<s:form action="test">
<s:textfield name="field"></s:textfield>
<s:token/> <!-- 添加token -->
<s:submit/>
</s:form>
转换成的网页源码 如下:
<form id="test" name="test" action="test" method="post">
<input type="text" name="field" value="" id="test_field"/>
<input type="hidden" name="struts.token.name" value="struts.token" />
<input type="hidden" name="struts.token" value="NIZV18PR9HIRA3UARD0HWXHRRK4NMIQL" />
<input type="submit" id="test_0" value="Submit"/>
</form>
第二步:在相应的 action 中添加拦截器和 invalid.token 视图
<action name="test" class="test.showAction">
<interceptor-ref name="defaultStack"></interceptor-ref> ①
<interceptor-ref name="token"></interceptor-ref> ②
<result name="success">/show.jsp</result>
<result name="invalid.token">/index.jsp</result> ③
</action>
①. Struts 默认拦截器
②.阻止表单重复提交的拦截器
③.重复提交后的跳转视图
注意: struts 一旦额外添加其他拦截器后,就不会调用默认拦截器,即①,因此要额外添加默认拦截器,否则默认拦截器提供的一些功能就无法使用
第三步: invaid.token 页面打印错误信息,一样可以使用 struts 标签。如下:
<s:actionerror/>
分享到:
相关推荐
本文详细介绍了如何在Struts2框架中使用`<s:token/>`标签和`token`拦截器来防止表单重复提交。通过这种方式,可以有效地避免因重复提交而导致的数据冗余和其他潜在问题。对于开发者来说,理解和掌握这些技术是非常...
<%@ taglib prefix="s" uri="/struts-tags" %> 就能使用struts2.0的标签库 下面就介绍每个标签的具体应用实例说明:按字母排列 A: 1. 2. <s:a href=""></s:a>-----超链接,类似于html里的<a></a> 3. <s:...
而在 Struts2 中,所有的标签都被统一管理,并通过在 JSP 文件头部声明 `<%@ taglib prefix="s" uri="/struts-tags" %>` 来启用 Struts2 的标签库。这种方式简化了开发过程中的配置工作,使得开发者可以更加专注于...
`<s:token>`标签用于防止重复提交,与Struts2的Token拦截器配合使用。 `<s:tree>`标签用于生成树形结构,适用于层次数据的展示。 `<s:treenode>`定义树结构中的节点。 T. `<s:updownselect>`,`<s:url>`: `<s:...
`<s:token>` 用于防止重复提交,`<s:tree>` 创建树形结构,`<s:treenode>` 定义树节点,`<s:updownselect>` 创建可上下选择的多选框,`<s:url>` 生成URL,通常与Action关联。 以上就是Struts标签的基本介绍,它们极...
<s:token/> ``` #### 49. `<s:tree>` - 树形标签 创建树形结构。 ```xml <s:tree value="treeData" nodeLabel="%{#node.label}"/> ``` #### 50. `<s:treenode>` - 树节点标签 定义树中的节点。 ```xml <s:...
<s:option value="2" label="Option2"/> </s:optgroup> ``` ##### 31. `<s:optiontransferselect>` - 选项传递选择标签 用于实现选项传递选择功能。 ```jsp <s:optiontransferselect name="optionTransferSelect" ...
`<s:token>` 生成和检查令牌,防止重复提交。 Y. `<s:url>` 创建URL,可以附加参数,例如:`<s:url action="myAction"><s:param name="param1" value="value1" /></s:url>`。 Z. `<s:validate>` 验证表单字段。 ...
<s:merge var="mergedList" value="list1" into="list2"/> ``` ##### 30. `<s:optgroup>` 标签 - **用途**:创建分组的选项。 - **示例**: ```xml <s:optgroup label="Group 1" list="group1List" /> ``` ##...
总之,防止重复提交是Web应用开发中的重要一环,可以通过Struts2提供的 `<s:token>` 标签结合拦截器,或者结合客户端验证和服务器端状态管理等多种方式来实现。正确实施这些措施,可以有效避免数据的不一致性,提高...
本文将深入探讨Struts2的属性驱动和模型驱动的区别,以及如何防止表单的重复提交,并讲解如何在表单中正确显示验证信息。 ### 属性驱动与模型驱动 **属性驱动**(Property Driven)是Struts2中的一种常见做法,它...
- 示例:`<s:choose><s:when test="%{#session.user == 'admin'}">Admin Panel</s:when><s:otherwise>Guest</s:otherwise></s:choose>` - 用途:类似于 Java 中的 switch-case 结构,用于复杂的条件判断。 ##### ...
<input type="hidden" name="struts.token" value="<s:token/>" /> <input type="submit" value="提交" /> </form> ``` 4. **处理结果**: 如果用户重复提交,Struts会自动跳转到输入页面(`input.jsp`),你可以...
虽然 Struts 2 不再推荐使用 Struts 1.x 的标签,但在某些情况下仍然可能见到 `<s:bean>` 标签。此标签用于访问 JavaBean 的属性值。例如:`<s:bean name="user" property="firstName"/>`,这里的 `name` 指定了 ...
- `s:token`标签必须与`<s:form>`标签一起使用,因为Struts2的拦截器通常只在表单提交时起作用。 - 如果你使用的是GET方法,记得设置`<s:form method="get">`,因为默认是POST方法。 - 在实际应用中,可能还需要结合...
在配置示例代码中,开发者需要在login.jsp页面中加入<s:token></s:token>标签,并确保表单提交到对应的Action,如LoginAction。在Struts2的配置文件struts.xml中,需要配置action,并引用token拦截器和defaultStack...
在Struts2中防止表单重复提交的过程主要包括以下几个步骤: 1. **生成Token**:当用户发起表单请求时,服务器会生成一个唯一的Token并将其存储在服务器的会话(Session)中,同时将这个Token作为隐藏字段放入到HTML...
"防止表单重复提交 token"是Struts2提供的一种解决方案,通过在请求中加入一个唯一的token来确保请求的唯一性和一致性。 首先,我们来看如何实现这个机制。在Struts2中,我们可以使用拦截器(Interceptor)来实现...
<s:token/> <input type="submit" value="提交"/> </form> ``` 这里的`s:token`标签会自动生成一个隐藏的Token字段,其值与服务器端保存的Token对应。 5. 处理重复提交: 当用户尝试重复提交表单时,Struts2会...