学习心得之……如何用Tonken防止重复提交表单

时间:2021-08-23 14:31:25

一、 什么是Token   

Token 是指一个令牌,他是服务器端的技术,他是Struts 1的特性,表单与数据库之间不能直接的发生关系,而是通过令牌。没有令牌的不能和数据库访问。  

二、 Token工作机制  

这里以用户注册做为例子,这里有二个Acion:ForwordAction(转发的用户注册页面)、  LoginAction(提交注册页面,完成数据持久化),三个JSP:Login.jsp(提供用户注册的页面)、Index.jsp(用户注册成功的页面)。  

用户发个main.do,前段控制器调用ForwordAction,这个Action里New一个令牌,并把这个令牌的信息放到Session里(Session的信息放在request),同时转发到Login.jsp,在这个jsp有一个隐含对象,这个就是Session的Id信息。用户填写注册,用户发送Login.do请求提交信息表单时,页面会带着这个隐含对象,服务器这时,会检测到该页面有Token,并且这个Token是有效的,这时页面的信息将会放入数据库(数据持久化),至此成功完成用户的注册。转发到Index.jsp。  以上的说是用户没有误操作的情况下  

  如果,正在提交页面时,点击了刷新,这时又分为两种情况,如果已经完成对Token的校验,跳转到其他的页面,提示用户不用重复注册(Error.jsp)。如果没有数据没有进入数据库,则发送main.do转发到用户注册的页面。让用户继续注册。  

如果注册完成以后用户点击浏览器后退,这是有发送main.do请求,难么ForwordAction又会New一个Token,重复以上的过程,当用户发送再次发送Login.do请求时,服务器检测检测这个也面有Token,但是这时的Token,和数据库里的不匹配,服务器这里认定此时是重复注册,调转到其他的页面(Error.jsp)。  

如果用户关了浏览器,重新发送Login.do请求时,浏览器缓存页面信息,里面也Token,但是这是的Token和服务器不一样,这时服务器就认定此时是重复注册,转发到Error.jsp。  这样就有效的防止重复提交表单,渐少了对服务器压力  

其实防止重复提交表单还有其他的方法,例如有Ajax来实现Id的唯一性,Token给我感觉很麻烦。有什么其他的好的方法告诉我。

                                                                                          

                                                                                                  2009-06-14