Struts同步令牌防止表单重复提交实战指南

需积分: 9 0 下载量 89 浏览量 更新于2025-01-01 收藏 58KB PDF 举报
"本文主要介绍了如何使用Struts框架的同步令牌机制来防止表单的重复提交,以及这一机制的基本工作原理。" 在Web应用中,用户可能会意外地多次点击提交按钮,导致数据被重复处理,这称为重复提交问题。为了防止这种情况,Struts框架提供了一种名为同步令牌(Token)的机制。下面我们将详细讨论如何使用这个机制以及它的工作原理。 首先,我们需要在用户要提交的页面(如toSubmit.jsp)的Action中生成一个同步令牌。在打开该页面的Action1中,我们需要调用`saveToken(request)`方法。例如,在`execute`方法内: ```java public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 生成同步令牌 saveToken(request); return mapping.findForward("toSubmit"); } ``` 这个`saveToken`方法会将一个唯一的令牌存储到用户的会话(session)中,以供后续验证使用。 当用户提交表单时,请求会到达处理提交的Action2。在这个Action中,我们需要检查令牌的有效性。这是通过调用`isTokenValid(request, true)`来完成的: ```java public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 验证同步令牌 if (isTokenValid(request, true)) { // 执行提交操作 } else { // 重复提交,返回错误提示 return mapping.findForward("Error"); } } ``` `isTokenValid`方法会检查令牌是否有效,如果有效,则允许执行提交操作,否则返回错误。 值得注意的是,为了使Struts的同步令牌机制正常工作,表单`<form>`标签必须使用Struts的标签库,即`<html:form>`,因为这个自定义标签会自动处理令牌的嵌入和验证。 同步令牌的工作原理大致如下: 1. 生成令牌:在Action1中,`saveToken`方法会生成一个唯一的字符串(令牌),并将其存储到当前用户的会话中,键值对为`Globals.TRANSACTION_TOKEN_KEY`。 2. 添加令牌到页面:`<html:form>`标签会自动在表单中添加一个隐藏字段,包含当前的令牌值。 3. 提交表单:用户提交表单时,这个令牌会被一起发送到服务器。 4. 验证令牌:Action2接收到请求后,`isTokenValid`方法会检查请求中的令牌与会话中的令牌是否匹配,并且是否已使用过。如果匹配且未使用过,令牌被视为有效,执行提交操作;否则,认为是重复提交,返回错误。 通过这种方式,Struts的同步令牌机制有效地解决了表单的重复提交问题,确保每个请求只被处理一次,从而保护了数据的完整性。