- 浏览: 462005 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xbyy123:
如果底层原理是这样的话,那么太谢谢了,瞬间明白了spring事 ...
Spring事务原理 -
欢乐逗佛:
盗取一时爽,全家火葬场
java工厂模式三种 -
ananeye:
不错不错不错不错
spring 加载过程 -
ananeye:
写的浅显易懂,不错,赞一个。
Spring事务原理 -
18289753290:
我们平时好像不是这么写的。直接就是service了,servi ...
Spring事务原理
相信都有表单提交的情况, 很多时候不希望出现重复提交原来的数据, 那么如何防止重复提交问题, 下面我是思考和一些参考整理的结果, 先看看其原理:
防止重复提交原理:
首先,在页面访问的时候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需要用到,需要注意的是,当没有指定任何拦截器时,默认是隐式启用默认的拦截器的;
防止重复提交原理:
首先,在页面访问的时候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需要用到,需要注意的是,当没有指定任何拦截器时,默认是隐式启用默认的拦截器的;
发表评论
-
java定时器
2012-09-07 09:51 1106在现实生活中,会出现这样的例子,比如烧水,一般烧了20分钟后, ... -
java反射机制,注解,枚举
2012-07-17 08:44 17481) 要想使用反射,首先需要获得待处理类或对象所对应的Clas ... -
java反射机制应用场景
2012-04-25 10:12 6879反射机制实现: 1)导 ... -
java面试准备
2012-01-30 12:21 908一.集合 cccccccccc 二.java 中 String ... -
java模式之 桥接模式Briage
2011-10-11 17:03 1335Bridge模式的概念 Bridge ... -
java连接池
2011-09-28 16:06 862连接池最基本的目的: 1、重用连接,节省连接资源; 2、免 ... -
java生产word文档的方法
2011-09-28 11:23 10911.jacob(windows系统) 2.通过html.vm类 ... -
ArrayList与LinkedList的区别
2011-09-06 16:33 846一般大家都知道ArrayList和LinkedList的大致区 ... -
HashMap与HashTable的区别
2011-09-06 16:26 8571 HashMap不是线程安全的 ... -
java 集合类
2011-09-06 15:56 940java.util中包含了一些集合类,常用的有List,Set ... -
临时1111
2011-08-24 00:19 843初始化 flow=1 status=0 连接查询- 主表+ ... -
List 反序输出
2011-08-16 15:45 2760java.util.Collections.reverse(L ... -
java 调色转化
2011-08-01 17:46 929// TODO Auto-generated metho ... -
java文件拷贝
2011-08-01 17:35 1841//文件拷贝 import org.apache.common ... -
Map的三种遍历方法
2011-07-14 19:29 890集合的一个很重要的操作---遍历,学习了三种遍历方法,三种方 ... -
java定时器在web应用
2011-06-30 14:47 1201每天某个时间点(如每晚22点)执行某一功能. 首先介绍jav ... -
环境变量配置
2011-05-16 17:56 817CLASSPATH D:\jdk1.6.0_16\lib\dt ... -
jar包冲突串调问题-jar包密封
2011-04-12 17:25 3414引用 包密封 密封 JAR 文件中的一个包意味着在这个包中定 ... -
jar包详解和META-INF作用(转)
2011-04-12 17:24 2610如果我们使用 JDK 的 jar ... -
java程序读取properties配置文件中文乱码
2011-04-08 10:59 11689java 读取properties文件时,如果包含中文,那么j ...
相关推荐
本文将深入探讨Struts2防止重复提交的解决方案,包括拦截器的配置、重复提交的原因以及`token`机制的工作原理。 首先,了解Struts2拦截器的基础知识是至关重要的。在Struts2框架中,拦截器是基于AOP(面向切面编程...
下面将详细讲解Struts2令牌解决重复提交问题的过程: 1. **生成令牌**:在Action中,使用`TokenAwareActionSupport`作为基类,这个类实现了`TokenSessionStore`接口,可以方便地获取和验证令牌。在表单展示之前,...
### Struts解决重复提交步骤 在Web应用开发中,表单重复提交问题一直是困扰开发者的一个常见问题。特别是在一些涉及敏感操作如订单提交、支付确认等场景下,避免重复提交尤为重要。Struts框架作为Java Web应用开发...
Struts2是一个流行的Java Web框架,它为开发者...通过上述步骤,Struts2的`s:token`标签可以帮助开发者有效地防止重复提交,保证Web应用程序的数据一致性。理解并正确使用这个功能,可以提升应用的健壮性和用户体验。
在处理用户表单提交时,Struts框架可能会遇到一个常见的问题,即表单重复提交。这种情况通常发生在用户点击提交按钮后,由于网络延迟或其他原因导致请求被多次发送,从而可能对服务器端造成多次数据插入或更新,导致...
Struts2提供了几种策略来防止表单的重复提交,确保请求的唯一性和事务的一致性。 一、令牌(Token)机制 Struts2的Token插件是防止重复提交的一种常见方法。这里的"Strut2Token"很可能是指这个插件的应用。它的...
Struts Token机制是一种防止表单重复提交的有效策略,尤其在处理关键操作时,如金融交易或数据修改,防止用户意外或恶意多次点击提交按钮导致的数据重复性问题。下面将详细介绍Struts Token的工作原理、实现方式及其...
### 解决Struts中通过Token防止重复提交的问题 在Web应用程序开发中,特别是基于MVC架构的框架如Apache Struts中,确保用户操作的安全性是非常重要的。其中一项常见且重要的安全措施是防止表单的重复提交。本文将...
通过这样的设计,初学者可以了解到Struts2的基本工作原理,以及如何利用拦截器解决实际问题,如防止重复提交。同时,这个项目也为实践提供了基础,让学习者能够动手实现一个完整的登录功能,并在此过程中深入理解...
总结,Struts2的tokenSession机制是JavaEE Web开发中防止重复提交的有效手段,通过生成并校验token,确保每个请求的唯一性,从而保护了业务数据的完整性。在实际项目中,我们需要正确配置和使用这个机制,以提高应用...
以下是使用Struts2拦截器解决重复提交问题的基本步骤: 1. **创建拦截器类**:首先,我们需要定义一个实现了`Interceptor`接口的Java类。这个类需要覆盖`intercept`方法,该方法在每个请求到达Action之前被调用。在...
综上所述,Struts框架通过Token机制有效地解决了表单重复提交的问题,提供了更健壮的Web应用安全性。正确理解和应用这一机制对于Java Web开发者来说至关重要。在实际项目中,结合其他防御策略,如CSRF防护,可以...
- **类型转换**:Struts2提供了一套强大的类型转换机制,能够将用户提交的表单数据自动转换成所需的对象类型。 - **国际化支持**:Struts2提供了完善的国际化(i18n)支持,可以通过配置文件轻松实现多语言切换。 #...
1. **配置Action**: 在Struts配置文件(如struts.xml)中,为需要防止重复提交的Action添加`token`拦截器。 ```xml <result name="success">/success.jsp <result name="input">/input.jsp ``` 2. **创建...
- **内置拦截器**:Struts2提供了一系列内置拦截器,如`params`(参数填充)、`token`(防止重复提交)、`servletConfig`(获取Servlet配置信息)等。 - **自定义拦截器**:可以通过实现`Interceptor`接口或继承`...
【标题】:“Hibernate、Spring和Struts工作原理及使用理由” 【内容】: Hibernate是一个流行的Java持久化框架,它的核心工作原理主要包括以下步骤: 1. **读取并解析配置文件**:Hibernate通过读取hibernate....
### Struts Token机制防止页面刷新及重复提交 在Web应用开发过程中,特别是在使用MVC框架如Apache Struts进行开发时,防止表单重复提交是一个重要的安全措施。表单重复提交通常发生在用户点击“提交”按钮后,由于...
在本篇文章中,我们将深入探讨Struts2的拦截器原理以及如何在实际项目中应用拦截器。 拦截器在Struts2中的作用就像电影中的导演,它在动作执行前后插入额外的逻辑,比如日志记录、权限检查、数据验证等。这些操作不...