`
gcq04552015
  • 浏览: 462023 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts2重复提交原理

    博客分类:
  • java
 
阅读更多
相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据, 那么如何防止重复提交问题, 下面我是思考和一些参考整理的结果, 先看看其原理:




防止重复提交原理:

首先,在页面访问的时候server端产生一个标志位,其保存在session中,同时该标志位放到访问的页面的某个元素中(通常为隐藏域);

其次,在session存在的有效时间内,没有其它操作时其值保持不变,当提交表单到server端时,会判断client端提交过来的标志位和server端的标志位的值是否相等;

最后,判断标志位的值,如果相等,则执行自己期望的操作;如果不相等,则转向指定的页面;


这个原理在我以前在ASP中实现的这个功能是一样的,在JAVA,PHP都适用,只是实现语言不同而已, 在struts2中中只不过别人都是封装成一些标签(client,server两端都做处理)可直接使用罢了,其实完全可以自己重写而不必受制于那些框架,但对开发着要求要明白其原理,程序写法也稍加注意吧;





下面看在JAVA的 struts2 是如何实现 防止重复提交问题 的:

1、使用Struts2的表单标签,其中需要增加token标签。如下:





[java] view plaincopy
01.... 
02.<%@ taglib uri="/struts-tags" prefix="s" %>  
03.<!-- 注意:要确保jsp中能使用struts2标签,在web.xml中定义的过滤类型为任意,即/* --> 
04.... 
05.<s:form action="goURL" name="form1">  
06.... 
07.<s:token/>  
08.<s:reset/><s:submit/>  
09.</s:form>  

2、在struts配置文件中增加token拦截器。(token 和 token-session 拦截器的启用,是在 struts.xml 配置文件中,既可以为包启用,也可以单独为某个 action 启用)


2.1  在 Action 中启用 token ,该拦截器仅为本 action 使用,





[html] view plaincopy
01.<?xml version="1.0" encoding="UTF-8"?>  
02.<!DOCTYPE struts PUBLIC  
03."-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
04."http://struts.apache.org/dtds/struts-2.0.dtd">  
05.<struts>  
06.<package name="myGC" extends="struts-default">  
07.<action name="goURL" class="com.gc.actions.goURLAction" method="execute">  
08.<interceptor-ref name="defaultStack"/>  
09.<interceptor-ref name="token"/>  
10.<result name="success">/success.jsp</result>  
11.<result name="invalid.token">/inputPage.jsp</result>  
12.</action>  
13.</package>  
14.</struts>  

2.2 在包中启用 token , 该拦截器可为该包内所有的 action 元素使用;
注意,需要name为invaid.token的result。这是当拦截器判断是重复提交的时候,会转向的视图页面。





[html] view plaincopy
01.<package name="myGC" extends="struts-default">  
02.  <interceptors>  
03.      <interceptor-stack name="myStack">    
04.      <interceptor-ref name="token"/>    
05.      <interceptor-ref name="defaultStack"/>         
06.      </interceptor-stack>   
07.  </interceptors>  
08.  <default-interceptor-ref name="myStack"/>    
09.  <action name="goURL" class="com.gc.actions.goURLAction">  
10.    <result name="success">/success.jsp</result>  
11.    <result name="invalid.token">/inputPage.jsp</result>  
12.  </action>  
13.</package>  

3、invaid.token页面打印错误信息,一样可以使用struts标签。如下:





[html] view plaincopy
01.<s:actionerror/> 



注意:  如果在session失效时间外再提交页面,同样出现不相等的情况,因而转到 invaid.token 指定的视图页面中去;



总结:
1、JSP使用< s:token/ >标签的时候,Struts2会建立一个UUID(全局唯一的字符串)放在session中,并且会成为一个hidden放在form中。


2、token拦截器会判断客户端form提交的token值和session中保存的值是否equals。如果equals则执行Action。否则拦截器直接返回invaid.token结果转向对应的视图,Action对应的方法也不会执行;


3、当指定了别的拦截器时,如本例的token,仅仅完成某项功能,后面同时需要指定默认的拦截器,因struts2需要用到,需要注意的是,当没有指定任何拦截器时,默认是隐式启用默认的拦截器的;
分享到:
评论

相关推荐

    Struts2防止重复提交解决方案

    本文将深入探讨Struts2防止重复提交的解决方案,包括拦截器的配置、重复提交的原因以及`token`机制的工作原理。 首先,了解Struts2拦截器的基础知识是至关重要的。在Struts2框架中,拦截器是基于AOP(面向切面编程...

    struts2令牌解决页面重复提交问题

    下面将详细讲解Struts2令牌解决重复提交问题的过程: 1. **生成令牌**:在Action中,使用`TokenAwareActionSupport`作为基类,这个类实现了`TokenSessionStore`接口,可以方便地获取和验证令牌。在表单展示之前,...

    Struts解决重复提交步骤

    ### Struts解决重复提交步骤 在Web应用开发中,表单重复提交问题一直是困扰开发者的一个常见问题。特别是在一些涉及敏感操作如订单提交、支付确认等场景下,避免重复提交尤为重要。Struts框架作为Java Web应用开发...

    Struts2 防重复提交Demo

    Struts2是一个流行的Java Web框架,它为开发者...通过上述步骤,Struts2的`s:token`标签可以帮助开发者有效地防止重复提交,保证Web应用程序的数据一致性。理解并正确使用这个功能,可以提升应用的健壮性和用户体验。

    Struts表单重复提交问题

    在处理用户表单提交时,Struts框架可能会遇到一个常见的问题,即表单重复提交。这种情况通常发生在用户点击提交按钮后,由于网络延迟或其他原因导致请求被多次发送,从而可能对服务器端造成多次数据插入或更新,导致...

    struts2防止重复提交

    Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2的Token插件是防止重复提交的一种常见方法。这里的"Strut2Token"很可能是指这个插件的应用。它的...

    struts token机制解决表单重复提交

    Struts Token机制是一种防止表单重复提交的有效策略,尤其在处理关键操作时,如金融交易或数据修改,防止用户意外或恶意多次点击提交按钮导致的数据重复性问题。下面将详细介绍Struts Token的工作原理、实现方式及其...

    解决在struts 中可以通过token 来重复提交的问题

    ### 解决Struts中通过Token防止重复提交的问题 在Web应用程序开发中,特别是基于MVC架构的框架如Apache Struts中,确保用户操作的安全性是非常重要的。其中一项常见且重要的安全措施是防止表单的重复提交。本文将...

    struts2实现的简单登陆 附加拦截器防止重复提交

    通过这样的设计,初学者可以了解到Struts2的基本工作原理,以及如何利用拦截器解决实际问题,如防止重复提交。同时,这个项目也为实践提供了基础,让学习者能够动手实现一个完整的登录功能,并在此过程中深入理解...

    JavaEE Struts2利用tokenSession防止重复提交

    总结,Struts2的tokenSession机制是JavaEE Web开发中防止重复提交的有效手段,通过生成并校验token,确保每个请求的唯一性,从而保护了业务数据的完整性。在实际项目中,我们需要正确配置和使用这个机制,以提高应用...

    struts2拦截器解决重复提交源代码

    以下是使用Struts2拦截器解决重复提交问题的基本步骤: 1. **创建拦截器类**:首先,我们需要定义一个实现了`Interceptor`接口的Java类。这个类需要覆盖`intercept`方法,该方法在每个请求到达Action之前被调用。在...

    Struts之Token解决表单那重复提交

    综上所述,Struts框架通过Token机制有效地解决了表单重复提交的问题,提供了更健壮的Web应用安全性。正确理解和应用这一机制对于Java Web开发者来说至关重要。在实际项目中,结合其他防御策略,如CSRF防护,可以...

    Struts2 技术内幕——深入解析Struts2架构设计与实现原理

    - **类型转换**:Struts2提供了一套强大的类型转换机制,能够将用户提交的表单数据自动转换成所需的对象类型。 - **国际化支持**:Struts2提供了完善的国际化(i18n)支持,可以通过配置文件轻松实现多语言切换。 #...

    利用struts的token控制重复提交

    1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml &lt;result name="success"&gt;/success.jsp &lt;result name="input"&gt;/input.jsp ``` 2. **创建...

    15年9月传智播客视频struts2

    - **内置拦截器**:Struts2提供了一系列内置拦截器,如`params`(参数填充)、`token`(防止重复提交)、`servletConfig`(获取Servlet配置信息)等。 - **自定义拦截器**:可以通过实现`Interceptor`接口或继承`...

    Hibernate、Spring和Struts工作原理及使用理由

    【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....

    struts token 防止页面刷新,重复提交

    ### Struts Token机制防止页面刷新及重复提交 在Web应用开发过程中,特别是在使用MVC框架如Apache Struts进行开发时,防止表单重复提交是一个重要的安全措施。表单重复提交通常发生在用户点击“提交”按钮后,由于...

    Struts2之拦截器原理分析及使用案例struts008

    在本篇文章中,我们将深入探讨Struts2的拦截器原理以及如何在实际项目中应用拦截器。 拦截器在Struts2中的作用就像电影中的导演,它在动作执行前后插入额外的逻辑,比如日志记录、权限检查、数据验证等。这些操作不...

Global site tag (gtag.js) - Google Analytics