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. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库

    在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...

  2. 用scikit-learn进行LDA降维

    在线性判别分析LDA原理总结中,我们对LDA降维的原理做了总结,这里我们就对scikit-learn中LDA的降维使用做一个总结. 1. 对scikit-learn中LDA类概述 在scikit-le ...

  3. 一步一步使用ABP框架搭建正式项目系列教程

    研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...

  4. .Net多线程编程—任务Task

    1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的. 只读属性: 返回值 名称 说明 object AsyncState 表示在 ...

  5. ASP.NET Core的路由[1]:注册URL模式与HttpHandler的映射关系

    ASP.NET Core的路由是通过一个类型为RouterMiddleware的中间件来实现的.如果我们将最终处理HTTP请求的组件称为HttpHandler,那么RouterMiddleware中间 ...

  6. ASP.NET Core中如影随形的”依赖注入”[上]: 从两个不同的ServiceProvider说起

    我们一致在说 ASP.NET Core广泛地使用到了依赖注入,通过前面两个系列的介绍,相信读者朋友已经体会到了这一点.由于前面两章已经涵盖了依赖注入在管道构建过程中以及管道在处理请求过程的应用,但是内 ...

  7. 学习ASP.NET Core, 怎能不了解请求处理管道[6]: 管道是如何随着WebHost的开启被构建出来的?

    注册的服务器和中间件共同构成了ASP.NET Core用于处理请求的管道, 这样一个管道是在我们启动作为应用宿主的WebHost时构建出来的.要深刻了解这个管道是如何被构建出来的,我们就必须对WebH ...

  8. AJAX实现登录界面

    使用php跳转界面和AJAX都可实现登录界面的跳转的登录失败对的提醒.但是,php跳转的方式 需要额外加载其他界面,用户体验差.AJAX可实现当前页面只刷新需要的数据,不对当前网页进行 重新加载或者是 ...

  9. 深入理解CSS六种颜色模式

    前面的话 赏心悦目的颜色搭配让人感到舒服,修改元素颜色的功能让人趋之若鹜.但颜色规划不当,会让网站用户无所适从.颜色从<font color="">发展至今,保留了很多 ...

  10. 2016/12/30_Python

    今天主要学习内容: Python: 1.字典的使用 1)怎么创建字典 dicts = {"name":"juncx","age":17} d ...