当前位置: 首页 > news >正文

Struts防止重复提交

1·使用redirect = "true"

<action  path="/testingOption"    name="optionForm"  parameter="method"  scope="request"  type="com.appeon.manager.action.TestingOptionAction"  validate="false">  

<forward name="editTesting"    path="/pages/infomanager/superTesting/wap/content/editTesting.jsp" redirect = "true"/> </action>

或者在action中return new ActionForward(String path,Boolean redirect) redirect设置为true 缺点:如果jsp中使用了相对路径,而又没有设置<base href = "xxxx"/>,重定向之后可能一些相对路径会出问题。还有在设置<base href = "xxx"/>的时候,如果你的地址栏中使用的是ip地址,而base的href中使用的服务器名,会导致主机名不一致而导致session中的数据被清掉了。

 2·使用令牌

isTokenValid Return true if there is a transaction token stored in the user's current session, and the value submitted as a request parameter with this action matches it.
resetToken Reset the saved transaction token in the user's session.
saveToken Save a new transaction token in the user's current session, creating a new session if necessary.
为了防止用户重复提交,在数据读入.do未中加入saveToken(request),在第二个.do的开始判断isTokenValid(request)如果有效继续否则丢出错误信息,最后resetToken(requet)注销token
   基本原理  第一次提交,生成同步令牌 写入到session,同时把同步令牌写入到返回页中;  再次提交,比较同步令牌,如果相同,重复上面动作, 不同则重复提交了。 
 if (!isTokenValid(request)) {   
     errors.add(ActionErrors.GLOBAL_ERROR, 
     new ActionError("error.transaction.token"_)); 
    } 
    resetToken(request);
Struts中的isTokenValid(request,boolean)是用来防止表单重复提交的!  Struts在你每次访问Action的时候,根据用户会话ID和当前系统时间对于每个会话生成一个唯一令牌,保存在你的Session里面,如果你在Action里的函数里面,使用了saveToken(request),那么这个令牌也会保存在这个Action所Forward到的jsp所生成的静态页面里。 如果你在你Action的方法里使用了isTokenValid,那么Struts将会从你的request里面去获取这个令牌值,然后和Session里的令牌值做比较,如果两者相等,就不是重复提交,如果不相等,就是重复提交了。

if (!isTokenValid(request)) { // 判断当前用户会话中的令牌值和请求参数中的令牌值是否匹配。如果不匹配,就生成错误信息,并调用saveToken(request)方法,创建一个新令牌,然后返回。      request.setAttribute("info", "不允许重复提交表单!");

      } else { // 如果匹配,就调用resetToken(request)方法,从当前会话中删除Token,然后执行插入数据的操作。     resetToken(request);    }

3·客户端将提交按钮设置为disabled
4·引入同步机制(SynId)。
指导思想就是,为每一个页面编号,并在客户端和服务器端各产生一个副本,每次通过比较两端的编号是否一致,达到同步的目的。首先,由服务器产生这个编号,发送到客户端。这样这个编号在服务器和客户端各有一个副本。当客户提交页面时,服务器首先比较两个编号是否一致。如果一致,则处理提交,并产生一个新的编号,返回给客户端。此时如果客户回退并再次提交,客户端是旧编号,服务器端是新编号,显然不一致,因此服务器将判定这是一次重复提交,不予受理。对于同步环的产生、保存、比较,最好生成一个新“同步助手”类SynHelper,完成相应的操作。调用它的Jsp文件只需以JavaBean的形式引用即可。下面描述作为类SynHelper所需的基本方法:    private String generateSynId(){
  return Long.toString(System.currentTimeMillis());
}
protected void saveSynId(HttpServletRequest request){
  HttpSession session = request.getSession(); 
  session.setAttribute(SYN_ID,generateSynId());
}
protected boolean compareSynId(HttpServletRequest request){
  try{  
      HttpSession session = request.getSession(); 
      String serverSynId = session.getAttribute(SYN_ID);
      String clientSynId = request.getParameter(“CLIENT_SYN_ID”); 
      Return (serverSynId.equals(clientSynId));
     }catch(Exception e){ 
      return false;
     }
} 
对于客户端jsp在收到服务器的同步环后,必须将其保存在hidden中。具体实现如下:
  <input type="hidden" name="CLIENT_SYN_ID" value=<%=session.getAttribute("SYN_ID")%>>

相关文章:

  • html:multibox 的使用
  • Ie和firefox的Js区别
  • 软件工程师不可不知的10个概念
  • MySQL的数据类型
  • java.sql.date 与 java.util.date
  • JAVA日期类型
  • jsp页面添加行
  • 放大镜
  • 分页css样式
  • struts2+spring+hibernate分页
  • 一个实用的JSP分页
  • hibernate分页
  • select下拉列选提示选中内容(选中内容太长)
  • javamail发送邮件
  • struts实现的图片的上传和下载
  • $translatePartialLoader加载失败及解决方式
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • css属性的继承、初识值、计算值、当前值、应用值
  • Django 博客开发教程 16 - 统计文章阅读量
  • JavaScript DOM 10 - 滚动
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • java中具有继承关系的类及其对象初始化顺序
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • PHP的类修饰符与访问修饰符
  • Python十分钟制作属于你自己的个性logo
  • SQLServer之索引简介
  • vue-cli在webpack的配置文件探究
  • 给第三方使用接口的 URL 签名实现
  • 诡异!React stopPropagation失灵
  • 微服务核心架构梳理
  • 学习笔记:对象,原型和继承(1)
  • 正则与JS中的正则
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 【云吞铺子】性能抖动剖析(二)
  • gunicorn工作原理
  • #QT项目实战(天气预报)
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (译) 函数式 JS #1:简介
  • (转) ns2/nam与nam实现相关的文件
  • (转)Sql Server 保留几位小数的两种做法
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ./configure,make,make install的作用
  • .gitignore文件—git忽略文件
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • @Autowired和@Resource的区别
  • @Autowired自动装配
  • @SuppressWarnings注解
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [8-27]正则表达式、扩展表达式以及相关实战
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C++ 从入门到精通] 12.重载运算符、赋值运算符重载、析构函数
  • [C++]拼图游戏
  • [CareerCup][Google Interview] 实现一个具有get_min的Queue
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [CSDN首发]鱿鱼游戏的具体玩法详细介绍