zoukankan      html  css  js  c++  java
  • Struts2基础学习(八)—Struts2防止表单重复提交

    一、原因

         用户重复提交表单在某些场合将会造成非常严重的后果。例如,在使用信用卡进行在线支付的时候,如果服务器的响应速度太

    慢,用户有可能会多次点击提交按钮,而这可能导致那张信用卡上的金额被消费了多次。因此,重复提交表单会对你的系统带来逻

    辑影响,必须采取一些措施防止这类情况的发生。

        用户重复提交同一个HTML表单的原因有:  一、快速多次点击了提交按钮;二、提交表单后按下浏览器的刷新按钮。

    二、原理

         Struts2已经内置了能够防止用户重复提交同一个HTML表单的功能。它的工作原理: 让服务器生成一个唯一标记,并在服务器

    和表单里各保存一份这个标记的副本。此后,在用户提交表单的时候,表单里的标记将随着其他请求参数一起发送到服务器,服务

    器将对他收到的标记和它留存的标记进行比较。如果两者匹配,这次提交的表单被认为是有效的,服务器将对之做出必要的处理并

    重新设置一个新标记。随后,提交相同的表单就会失败,因为服务器上的标记已经重置。

         Struts2标签中的token标签,可以用来生成一个独一无二的标记。这个标记必须嵌套在form标签中使用,它会在表单里插入

    一个隐藏字段并把标记保存到HttpSession对象里。toke标签必须与Token或Token Session拦截器配合使用,两个拦截器都能

    对token标签进行处理。Token拦截器遇到重复提交表单的情况,会返回一个"invalid.token"结果并加上一个动作级别的错误。

    Token Session拦截器扩展了Token拦截器并提供了一种更复杂的服务,它采取的做法与Token拦截器不同,它只是阻断了后续

    的提交,这样用户不提交多少次,就好像只是提交了一次。

    三、解决步骤

    1.配置struts.xml

    		<action name="saveAction" class="com.kiwi.action.ValueStackAction" method="save">
    		
    		<!-- 需要在动作的声明中,为动作添加token拦截器,因为token拦截器不在defaultStack拦截器栈中 -->
    		<!-- 需要将拦截器放在拦截器栈的第一位,这是因为判断表单是否被重复提交的逻辑应该在表单处理前 -->
    			<interceptor-ref name="token"></interceptor-ref>  
                <interceptor-ref name="defaultStack"></interceptor-ref>
                
    			<result name="success">/success.jsp</result>
    			<result name="invalid.token">/error.jsp</result>
    		</action>

         此时,需要在动作的声明中,为动作添加token拦截器,因为token拦截器不在defaultStack拦截器栈中,注意,需要将拦截

    器放在拦截器栈的第一位,这是因为判断表单是否被重复提交的逻辑应该在表单处理前。

    2.创建页面

     <s:form action="saveAction" method="post">	
     
    	<s:textfield name="username" label="用户名"/>
    	<s:textfield name="password" label="密 码"/>
    	<s:textfield name="age" label="年 龄"/>
    	
    	<s:token></s:token>
    	
    	<s:submit value="提交"/>
     </s:form>

         要使用Struts 2的防止表单重复提交功能,需要在form标签中使用token标签,他会产生一个唯一的标识符,与其他参数一起提交到服务器,服务器会根据token标签所产生的标识符判断表单是否为重复提交的表单,这个功能是由Token拦截器完成的。

    结果:

         image

     

  • 相关阅读:
    OCP-1Z0-051-V9.02-108题
    以一种访问权限不允许的方式做了一个访问套接字的尝试
    常用的几个官方文档
    OCP-1Z0-053-V12.02-388题
    FusionChart实现奇偶间隔显示
    OCP-1Z0-053-V12.02-138题
    Tcp and Udp NAT 穿越穿透打洞
    flashback database实验(使用lgmnr找出还原时间点)
    flashback table实验(基于undo数据)
    flashback query实验(基于undo数据)
  • 原文地址:https://www.cnblogs.com/yangang2013/p/5495275.html
Copyright © 2011-2022 走看看