`

struts2 token防止表单重复提交

 
阅读更多

在实际应用当中我们经常会遇到在客户端表单会重复提交问题,发生重复提交表单的原因有以下几点:

1、多次点击submit按钮

2、在提交后多次刷新页面

3、URL回车

struts2在使用的过程中会出现表单重复提交的问题,这一问题在某些场合将会造成非常严重的后果。如何避免这一问题的发生,以下有三种方法可以解决。

 

  1. 改变result的type类型为redirect
    struts2 的默认result类型为dispatcher,当用户将信息提交到服务器,服务器响应采用forward方式调转到下一个页面后,此时地址栏中显示的是 上个页面的URL,若刷新当前页面,浏览器会将再次提交用户先前输入的数据,就会再次出现表单重复提交的问题。如果选择redirect方式跳转页面,这 样就不会出现重复提交的问题;
    缺点:redirect跳转无法满足开发过程中的一些需求。

  2. 采用令牌方式  <s:token />
    Html代码  收藏代码
    1. <form id="login_form" method="post" action="userAction!login">  
    2.                <s:token></s:token>  
    3.                         用 户<input type="text" name="username"  placeholder="输入教工号或学号" />  
    4.                   密   码<input type="password" name="password"  placeholder="输入密码" />  
    5.                <div id="btn">  
    6.                   <a id="loginbutton" href="javascript:void(0)" onclick="login_submit()">登录</a>  
    7.                   <a href="javascript:void(0)" onclick="login_reset()">清空</a>  
    8.               </div>  
    9.               </form>  
     
    Xml代码  收藏代码
    1. <action name="userAction"   class="com.yingjun.sharing.action.UserAction" >  
    2.             <interceptor-ref name="myStack" />  
    3.             <interceptor-ref name="token" />  
    4.             <result name="invalid.token">/WEB-INF/jsp/login.jsp</result>  
    5.             <result  name="input">/WEB-INF/jsp/register.jsp</result>  
    6.             <result name="regsuccess">/WEB-INF/jsp/login.jsp</result>  
    7.         </action>  
     缺点:对于一次正常提交和一次重复提交,使用token拦截器会使得浏览器最终重定向到invalid.token指定的Result

  3.  采用令牌方式2  <s:token />
    Xml代码  收藏代码
    1. <action name="userAction"   class="com.yingjun.sharing.action.UserAction" >  
    2.           <interceptor-ref name="tokenSession" >  
    3.                <param name="includeMethods">register</param>  
    4.           </interceptor-ref>  
    5.           <interceptor-ref name="myStack"/>  
    6. <result  name="input">/WEB-INF/jsp/register.jsp</result>  
    7. <result name="regsuccess">/WEB-INF/jsp/login.jsp</result>  
    8. </action>  
       把token拦截器换为tokenSession拦截器。tokenSession拦截器与token拦截器唯一的不同是在判断某个请求为重复请求之 后,并不是立即重定向到名为invalid.token的Result,而是先阻塞这个重复请求,直到浏览器响应最初的正常请求,然后就可以跳转到处理正 常请求后的Result了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics