您的位置:首页 > 编程语言 > Java开发

struts--token防止表单重复提交(源码分析)

2015-08-03 14:33 495 查看




顶 struts--token防止表单重复提交(源码分析)

发表于3年前(2012-11-28 12:32) 阅读(1852) | 评论(412人收藏此文章, 我要收藏

赞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="defaultStack" />

<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的定义:

?
注释:上面最重要的一行代码是<tag-class>org.apache.struts2.views.jsp.ui.TokenTag</tag-class>,指定标签对应的类

(2)TokenTag.java的源码:

?
注释:在这里面new Token对象。

(3)Token.java的源码:

?
(4)TokenHelper.setToken(name)

?
注释:产生一个UUID,并且保存到session中.

上面的步骤中Token已经创建好了,并且保存到了session中,现在我们看看拦截器是怎么处理的?

(5)Struts2的内置拦截器<interceptor
name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>

中TokenInterceptor.java 的源码:

?
(6)查看Token是否有效TokenHelper.validToken()源码:

?
到这里,结束了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: