struts--token防止表单重复提交(源码分析)
2015-08-03 14:33
495 查看
原
顶 struts--token防止表单重复提交(源码分析)
发表于3年前(2012-11-28 12:32) 阅读(1852) | 评论(4) 12人收藏此文章, 我要收藏赞1
struts token 表单重复提交
表单重复提交
1、造成重复提交主要的两个原因:
(1) 一是,服务器处理时间久。当用户在表单中填完信息,点击“提交”按钮后,由于服务器反应时间过长没能及时看到响应信息,或者出于其它目的,再次点击“提交”按钮,从而导致在服务器端接收到两条或多条相同的信息。如果信息需要存储到后台数据库中,如此以来就会产生数据库操作异常提示信息,以至于给用户带来错误信息提示,从而给用户的使用带来不便。
(1) 二是,forward跳转引起的重复提交。当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。当然你可以选择redirect方式跳转页面,这样就不会出现重复提交的问题;但有时为了达到某种效果或式。者出于网站安全的目的需要隐藏网页跳转,而不得不采用forward跳转方
2、 对token的简单理解:
(1) 当用户首次访问包含表单的页面时,服务器会在这次会话中创建一个session对象,并产生一个令牌值,然后将这个令牌值作为隐藏输入域的值,随表单一起发送到服务器端,同时将令牌值保存到Session中。
(2) 当用户提交页面时,服务器首先判断请求参数中的令牌值和Session中保存的令牌值是否相等,若相等,则清楚Session中的令牌值,然后执行数据处理操作。如果不相等,则提示用户已经提交过了表单,同时产生一个新的令牌值,保存到Session中。当用户重新访问提交数据页面时,将新产生的令牌值作为隐藏输入域的值。
3、应用步骤:
(1)struts.xml配置文件中添加token拦截器
?
<interceptor-ref name="token" />
(2)jsp页面中在form表单中添加<s:token></s:token>,并且在jsp头上引入<%@ taglib uri="/struts-tags" prefix="s"%>
4、源码分析:
(1)<s:token>标签在struts-tags.tld的定义:
?
(2)TokenTag.java的源码:
?
(3)Token.java的源码:
?
?
上面的步骤中Token已经创建好了,并且保存到了session中,现在我们看看拦截器是怎么处理的?
(5)Struts2的内置拦截器<interceptor
name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
中TokenInterceptor.java 的源码:
?
?
相关文章推荐
- 使用Java反射(Reflect)、自定义注解(Customer Annotation)生成简单SQL语句
- 'DeploymentBuilder' on project 'Struts2Final'. java.lang.NullPointerException。
- 一步步优化JVM四:决定Java堆的大小以及内存占用
- java中的String的isEmpty和length方法测试
- 性能测试脚本开发(C&C#&Java)
- Java编码风格
- FatMouse and JavaBean II zoj2526
- Java并发性和多线程介绍目录
- 动态方法调用
- java在acm中常用基础技巧方法
- Eclipse4.5 mars 配置Velocity插件
- Java中JDBC环境配置
- Java注解导图
- 5.0上java.lang.IllegalArgumentException: Service Intent must be explicit异常
- 一个困扰很久的异常java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- java---socket编程之客户端代码
- 8.3facebook分享后不回调结果原因,java标签代码
- myeclipse取消js的提示错误和一些常规操作
- Java导出csv文件乱码的解决方法
- java---socket编程之服务器端