struts有自带的Token(令牌)的机制来解决重复提交(包括后退,刷新等).举例:
假设:假设有一个新增用户的填写表单页面,填写完后点击"提交"按钮完成数据库录入功能,要求不能重复提交(指类似刷新页面的情况).此时,需要有两个action(第一个action用来生成hidden的token值.第二个action用来校验token值,通过判断来决定是不是重复提交,不是则提交操作,否则提示错误)和至少一个页面(保存token值和填写用户信息的录入页面)来完成校验是否重复提交.此处有两个页面来完成.
为了方便,用户表只有两个字段用户名<username>和密码<password>:
具体逻辑如下:
index.jsp--链接--> PrepareAddUserAction.java--转发并生成token--> addUser.jsp--提交-->
AddUserAction.java--首先校验 '是否重复提交 ',是提示错误信息,不是,执行数据库操作.
部分相关代码(省略formbean的代码):
========index.jsp========
<html> <head> <title> 测试 </title> </head> <body>
<a href= " <%=request.getContextPath()%> /PrepareAddUserAction.java "> 新增用户 </a>
</body> </html>
=========PrepareAddUserAction.java=========
package com.tseyimwah.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class PrepareAddUserAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {
.........//相关方法
saveToken(request); //在下一个页面addUser.jsp生成hidden类型的token值
return mapping.findForward( "addUser ");//页面跳转
}
}
==========addUser.jsp=============
此处代码没有什么要求,含有form的普通struts页面,代码省略,里面的 "提交 "按纽给AddUserAction.java,即 <html:form action= "/AddUserAction.do " method= "post ">
============AddUserAction.java=====
package com.tseyimwah.struts.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class AddUserAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) throws HibernateException {
//判断token值,如果是重复提交跳转到错误页面则提示出错信息,否则执行相关的数据库操作
if (!isTokenValid(request)){
request.setAttribute(GlobalKeys.MESSAGE_ID, "不允许重复提交! ");//设置出错信息
return (mapping.findForward( "errorPage "));
} else
resetToken(request); //重新设置token值,可不用
}
......
......//其他的相关方法,如设置相关属性值,调用相关的数据库操作等
return (mapping.findForward( "addUserSucess "));//新增用户成功的页面
}
这只是将相关的必要代码写出,根据需要可以改写相关的代码.
分享到:
相关推荐
通过以上步骤,Struts1.2的Token机制就能有效地防止表单的重复提交。但需要注意的是,Token机制并不能解决所有类型的重复提交问题,例如异步请求(Ajax)的重复提交。在这种情况下,通常需要在客户端进行额外的控制...
spring1.2 struts1.2 hibernate 框架 token防刷新防重复提交(自定义) md5加密 验证码 此为第二部分,需要将三个包合在一起解压
请注意共三部分要全下才能解压,此为第三部分,需要将三个包合在一起解压 spring1.2 struts1.2 hibernate 框架 token防刷新防重复提交(自定义) md5加密 验证码 绝对超值,呵呵
- 使用Token机制防止重复提交。 - 在`struts.xml`中配置Token拦截器。 - 在Action类中处理Token验证逻辑。 #### 八、杂项 **8.1 常见问题解答** - **问题汇总**:针对Struts2开发过程中常见的问题进行总结和解答...
Struts 支持使用 Token 来防止重复提交表单数据。在页面中可以通过 `<a href="mytoken.do"></a>` 的方式指向一个 Action,在该 Action 中保存一个 Token(如 `this.saveToken(request)`),然后在提交表单时验证 ...
15.3 使用令牌防止表单重复提交 313 15.3.1 使用s:token/表单标签 313 15.3.2 令牌拦截器规则的例外 314 15.4 自动显示等待页面 316 15.5 完成CRUD操作的一个动作 317 15.5.1 CRUD 317 15.5.2 拦截器和接口 318 ...
### 知识点十三:防止重复提交 #### 13.1 问题背景 在Web应用中,由于网络延迟等原因,用户可能会不小心多次点击提交按钮,导致数据重复提交。 #### 13.2 解决方案 - **Token机制**:每次提交前生成一个唯一的...
### Struts标签、动态ActionForm、上传组件及...此外,通过引入Token机制来解决表单重复提交问题,以及利用SmartUpload等组件实现文件上传功能,都使得Struts成为一个强大的工具箱,适用于构建复杂的企业级Web应用。
第15章防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能...
第15章 防止重复提交 252 15.1 标记管理 252 15.2 使用Token拦截器 253 15.3 使用Token Session拦截器 256 15.4 小结 257 第16章 调试与性能分析 258 16.1 debug标签 258 16.2 Debugging拦截器 259 16.3 性能分析 ...