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>

12、Struts2表单重复提交的更多相关文章

  1. Struts2防止表单重复提交

    1.说明 系统拦截器的应用. 表单重复提交:当使用请求转化进行跳转的时候,存在着表单重复提交的问题. 2.在表单中加入s:token 如果页面加入了struts2的标签,页面的请求必须进入struts ...

  2. 【转】Struts2解决表单重复提交问题

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

  3. [原创]java WEB学习笔记73:Struts2 学习之路-- strut2中防止表单重复提交

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. struts2视频学习笔记 29-30(Struts 2常用标签,防止表单重复提交)

    课时28 Struts 2常用标签解说 property标签 property标签用于输出指定值: <s:set name="name" value="'kk'&q ...

  5. Struts2笔记——利用token防止表单重复提交

    在一些项目中经常会让用户提交表单,当用户点击按钮提交后,如果再次浏览器刷新,这就会造成表单重复提交,若是提交的内容上传至服务器并请求数据库保存,重复提交的表单可能会导致错误,然后跳转到错误界面,这是一 ...

  6. struts2之防止表单重复提交

    struts.xml配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts ...

  7. Struts2 处理表单重复提交

    * 在表单页面中增加一个隐藏域:<s:token></s:token>(需要在表单内)        * 创建一个struts.xml的配置文件,具体配置如下:         ...

  8. Struts2基础学习(八)—Struts2防止表单重复提交

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

  9. Struts2第十三篇【防止表单重复提交】

    回顾防止表单重复提交 当我们学习Session的时候已经通过Session来编写了一个防止表单重复提交的小程序了,我们来回顾一下我们当时是怎么做的: 在Servlet上生成独一无二的token,保存在 ...

随机推荐

  1. Shell特殊变量

    $ 表示当前Shell进程的ID,即pid $echo $$ 运行结果 特殊变量列表 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数.n 是一个数字,表示第几个参数.例如,第一个参数 ...

  2. Jquery的点击事件,三句代码完成全选事件

    先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  3. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  4. JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题

    1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...

  5. addTwoNumbers

    大神的代码好短,自己写的120多行=_= 各种判断 ListNode *f(ListNode *l1, ListNode *l2) { ListNode *p1 = l1; ListNode *p2 ...

  6. C# 序列化与反序列化几种格式的转换

    这里介绍了几种方式之间的序列化与反序列化之间的转换 首先介绍的如何序列化,将object对象序列化常见的两种方式即string和xml对象; 第一种将object转换为string对象,这种比较简单没 ...

  7. JavaScript基础学习-函数及作用域

    函数和作用域是JavaScript的重要组成部分,我们在使用JavaScript编写程序的过程中经常要用到这两部分内容,作为初学者,我经常有困惑,借助写此博文来巩固下之前学习的内容. (一)JavaS ...

  8. DBobjectsCompareScript(数据库对象比较).sql

    use master goIF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[func_CompareDBobjectsReColu ...

  9. Vim使用

    模式 ESC\Ctrl+c:退出编辑模式 ZZ\wq:命令模式下保存退出 编辑 i:进入编辑模式 I:转到行首非空字符开始编辑 s:删除当前字符进入编辑模式 a:从当前字符后开始编辑 A:从当前行末非 ...

  10. [jquery]jquery正则表达式验证(手机号、身份证号、中文名称)

    数字判断方法:isNaN()函数 test()方法 判断字符串中是否匹配到正则表达式内容,返回的是boolean值 ( true / false ) // 验证中文名称 function isChin ...