Struts中解决表单重复提交有关问题

Struts中解决表单重复提交问题
在实际网页浏览中,用户在提交表单后,由于服务器端响应慢等问题,用户在没有得到响应时可能会单击浏览器中的后退再次对表单进行提交,这样用户向服务器提交了两次请求,这样设计既降低了用户的体验度有给服务器带来了负担。为了使WEB能够识别用户的重复提交操作并相应给用户以直观提示,Struts中采用了同步令牌(Token)机制来解决这一问题。



      同步令牌(Token)机制的基本原理是:当用户进行提交后,会为该用户产生一个唯一标识存在Session作用域中,当用户后退操作重复提交后,后台业务会首先判断作用域中的令牌是否与当前令牌相等,如果相等则继续执行业务操作,如果不相等则产生错误信息响应给客户。



      代码实现(已注册为例):



        

Java代码
public class RegPetAction extends DispatchAction {  
 
       //注册准备  
       public ActionForward regPetPre(ActionMapping mapping, ActionForm form,  
            HttpServletRequest request, HttpServletResponse response)  
            throws Exception {  
        this.saveToken(request);  //保存一个令牌  
        return mapping.findForward("reg");  
       }  
      
       //开始注册  
       public ActionForward regPet(ActionMapping mapping, ActionForm form,  
            HttpServletRequest request, HttpServletResponse response)  
            throws Exception {  
          
        //比较两次令牌是否相等  
        if(! this.isTokenValid(request)){  
            ActionErrors errors = new ActionErrors();  
            errors.add("can_not_reSubmit",new ActionError("can_not_reSubmit"));  
            this.saveErrors(request, errors);  
            return mapping.findForward("reg");  
        }  
        this.resetToken(request); //删除作用域中的令牌  
          
        //执行注册业务方法  
    }