1. 什么是表单重复提交

    • 表单的重复提交:
    • 若刷新表单页面, 再提交表单不算重复提交.
    • 在不刷新表单页面的前提下:
      • 多次点击提交按钮
      • 已经提交成功, 按 "回退" 之后, 再点击 "提交按钮".
      • 在控制器响应页面的形式为转发情况下,若已经提交成功, 然后点击 "刷新(F5)“
    • 重复提交的缺点:
      • 加重了服务器的负担
      • 可能导致错误操作.
    • token(令牌)
      1. 用户在访问页面时,我们要生成一个随机的token值
      2. 将该值放入到session域中,同时放在表单隐藏域中
      3. 用户提交请求时,隐藏域中token将会一起提交
      4. 服务器在处理请求时先要检查请求参数中的token和session中的token是否一致
        • 如果一致,则处理请求
        • 否则,返回错误页面
      5. 注意,token使用过一次以后必须要从session域中移除
  2. Struts2 解决表单重复提交
  1. 标记管理

    • Struts 提供的 token 标签可以用来生成一个独一无二的标记. 这个标签必须嵌套在 form 标签的内部使用, 它将在表单里插入一个隐藏字段并把标记值(隐藏域的字段的值)保存在HttpSession 对象里.
    • Token 标签必须与 Token 或 TokenSession 拦截器配合使用, 这两个拦截器都能对标记进行处理.
    • Token 拦截器在遇到重复提交情况时, 会返回 invalid.token 结果并加上一个 Action 错误. 这种错误默认的消息是: The form has already been processed or no token was supplied, please try again.
    • TokenSession 拦截器采取的做法只是阻断后续的提交, 用户将看到同样的响应,但实际上并没有重复提交
  2. Struts2 解决表单的重复提交问题:
    • 在 s:form 中添加 s:token 子标签

      • 生成一个隐藏域
      • 在 session 添加一个属性值
      • 隐藏域的值和 session 的属性值是一致的.
    • 使用 Token 或 TokenSession 拦截器.
      • 这两个拦截器均不在默认的拦截器栈中, 所以需要手工配置一下
      • 若使用 Token 拦截器, 则需要配置一个 token.valid 的 result
      • 若使用 TokenSession 拦截器, 则不需要配置任何其它的 result
    • Token VS TokenSession
      • 都是解决表单重复提交问题的
      • 使用 token 拦截器会转到 token.valid 这个 result
      • 使用 tokenSession 拦截器则还会响应那个目标页面, 但不会执行 tokenSession 的后续拦截器. 就像什么都没发生过一样!
    • 可以使用 s:actionerror 标签来显示重复提交的错误消息.
      • 该错误消息可以在国际化资源文件中覆盖. 该消息可以在 struts-messages.properties 文件中找到struts.messages.invalid.token=The form has already been processed or no token was supplied, please try again.
<s:form action="testForm" ><!-- 增加token 标签,隐藏属性 --><s:token></s:token><s:textfield name="username" label="用户名"></s:textfield><s:submit value="提交"></s:submit>
</s:form>
<!-- token 拦截器 -->
<action name="testForm" class="org.pan.action.TestFormAction" method="testForm"><!-- 使用token 拦截器,进行表单重复提交校验 --><interceptor-ref name="token"></interceptor-ref><!-- 不要忘记默认的拦截器栈--><interceptor-ref name="defaultStack"></interceptor-ref><!-- 如果是使用的是 token 拦截器,校验失败后会转到 invalid.token --><result name="invalid.token">/WEB-INF/views/token-error.jsp</result><result name="success">/WEB-INF/views/success.jsp</result>
</action>
<action name="testForm" class="org.pan.action.TestFormAction" method="testForm"><!-- 使用tokenSession 拦截器,进行表单重复提交校验 --><interceptor-ref name="tokenSession"></interceptor-ref><!-- 不要忘记默认的拦截器栈--><interceptor-ref name="defaultStack"></interceptor-ref><!-- 如果是使用的是 tokenSession 拦截器,校验后会回到返回的 action方法 result。就像什么都没发生过 --><result name="success">/WEB-INF/views/success.jsp</result>
</action>

转载于:https://www.cnblogs.com/MPPC/p/6134207.html

12、Struts2表单重复提交相关推荐

  1. 使用Struts2防止表单重复提交

    用户重复提交表单在某些场合将会造成非常严重的后果.例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次.因此,重复提 ...

  2. Struts2防止表单重复提交

    最近开发中涉及到了表单重复提次的问题,通过研究做个总结. 防止表单重复提交主要用的到标签是<s: token />,拦截器 <interceptor-ref name="t ...

  3. Struts2框架学习之七:避免表单重复提交

    前言 防止表单重复提交在web开发中是一个经常遇到的问题,一般来避免重复提交有两种方式:客户端JavaScript代码实现和服务端代码实现.这里主要介绍服务端的实现方式.在服务端实现表单重复提交的基本 ...

  4. struts2 自带的 token防止表单重复提交拦截器

    在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name=&quo ...

  5. Struts2学习笔记(十八) 防止表单重复提交

    概述 有些时候,我们在想某个网页提交了信息之后,由于某些原因,我们会重复点击提交,或者刷新页面,或者是在提交页面呈现之后点击后退按钮,从而导致这些表单数据被重复提交.在大多数情况下我们是不希望这种情况 ...

  6. Java Web学习总结(12)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  7. JavaWeb学习总结(十三)——使用Session防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

  8. JAVA_OA(十四)番外:JAVAWEB防止表单重复提交的方法整合(包括集群部署)

    因为自己要用,所以查找了网络上javaweb项目防止表单重复提交的方法,有些部分不太好找,所以整合后贴出来,首先是孤傲苍狼的一部分博客文章,集群部署的解决方案在后面(注意大红字) 原文出处:孤傲苍狼的 ...

  9. java怎么防止表单重复提交_如何防止表单重复提交

    在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交. 一.表单重复提 ...

最新文章

  1. msdn画圆弧函数_复变函数与积分变换 简明笔记(八):保形映射(共形映射)
  2. 使用Iterator迭代器循环集合
  3. phpstrom函数注释模板_PHPstorm 函数时间注释的修改
  4. 我为什么重新开始学习数学?
  5. 四管前级怎么去掉高低音音调_TDG Audio达芬奇:什么是前级,后极?
  6. Boost:宏BOOST_NO_EXCEPTIONS的使用实例
  7. Mybatis下collections使用pageHelper进行分页
  8. oracle的ora01504,Oracle中的ORA-01548: active rollback segment '_SYSSMU1$' found
  9. python二维数据读取对齐_python代码要严格对齐
  10. SSRS里面的if else表达式 和决策函数
  11. python开源bi_推荐一套开源BI工具?
  12. 在PHP项目中使用Standford Moss代码查重系统
  13. 7.基本数据类型详细讲解-int/bool/str
  14. Java交换二叉树的左右子树_二叉树左右子树交换
  15. Matlab Shift Arithmetic模块
  16. uni-app 压缩图片(base64上传)包含图片验证
  17. python五子棋程序教程_python实现五子棋游戏
  18. java坦克大战课设报告_java课程设计之坦克大战
  19. 火炬开发区理工学校计算机等级考,我校召开2018下半年全国计算机等级考试考务工作会...
  20. 三维动画制作软件测试指标,三维动画设计师需要具备哪些条件

热门文章

  1. [ACTF2020 新生赛]Upload
  2. hdu 2191 多重背包入门
  3. HoughCircles 函数
  4. php orm url,PHP ORM使用之
  5. [深搜]24点--改进版本
  6. 最近使用SIFT匹配,尝试了一下从大图片中提取小图片的方法,不怎么好使
  7. 解决Genymotion运行Android 5.0一直卡在开机界面
  8. OC本学习笔记Foundatio框架集
  9. Android中的Touch事件
  10. 允许修改 SharePoint2010 中的电子邮件