java 后退防止重复提交

转载来源:http://blog.csdn.net/u011410116/article/details/35989151

WAP商城订单重复提交解决方法,步骤:

1.javascript脚本控制法:提交按钮提交之后变为不可用状态(此步骤掩人耳目,只是对不懂技术的人而言能起一点作用)

2.令牌控制法:在跳转到订单提交按钮的页面时,给页面添加一个唯一值,在订单提交过程中,确认这个唯一值是否已经用过(这样当第一次提交时会认为没有提交过,后来重复提交的订单执行到这一步会跳出)

此处为第二种方法,以下是代码:

  1. import java.security.MessageDigest;  
  2. import java.security.NoSuchAlgorithmException;  
  3. import java.util.Random;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6.   
  7. import sun.misc.BASE64Encoder;  
  8.   
  9. /** 
  10.  * @description: 令牌处理,防止重复提交 
  11.  * @author: shaojie 
  12.  * @date: 2014-5-21 下午02:32:49 
  13.  * @version: 1.0 
  14.  */  
  15. public class TokenProcessor {  
  16.       
  17.     /** 
  18.      * 生成一个令牌 
  19.      * @return String 
  20.      */  
  21.     public String generateToken()  {    
  22.         String token=System.currentTimeMillis()+new Random().nextInt()+“”;    
  23.         try {    
  24.             MessageDigest md=MessageDigest.getInstance(”md5”);    
  25.             byte[] md5=md.digest(token.getBytes());    
  26.             //base64编码    
  27.             BASE64Encoder encoder=new BASE64Encoder();    
  28.             return encoder.encode(md5);    
  29.         } catch (NoSuchAlgorithmException e) {    
  30.             // TODO Auto-generated catch block    
  31.             throw new RuntimeException(e);    
  32.         }    
  33.     }    
  34.       
  35.     /** 
  36.      * 管理令牌 
  37.      * @param request 
  38.      * @param mType 管理类型 p:存放 d:删除 
  39.      * @param void 
  40.      */  
  41.     public void managerToken(HttpServletRequest request,String mType){  
  42.         if(“p”.equals(mType)){  
  43.             //产生随机数     
  44.             String token=generateToken();    
  45.             request.getSession().setAttribute(”token”, token);   
  46.         }else if(“d”.equals(mType)){  
  47.             request.getSession().removeAttribute(”token”);   
  48.         }  
  49.     }  
  50.       
  51.     /** 
  52.      * 令牌是否验证通过 
  53.      * @param request 
  54.      * @return boolean 
  55.      */  
  56.     public boolean isTokenValid(HttpServletRequest request) {  
  57.         String client_token = request.getParameter(”token”);  
  58.         if (client_token == null) {  
  59.             return false;  
  60.         }  
  61.         String server_token = (String) request.getSession().getAttribute(”token”);  
  62.         if (server_token == null) {  
  63.             return false;  
  64.         }  
  65.         if (!client_token.equals(server_token)) {  
  66.             return false;  
  67.         }  
  68.         return true;  
  69.     }   
  70. }  
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import sun.misc.BASE64Encoder;

/**
 * @description: 令牌处理,防止重复提交
 * @author: shaojie
 * @date: 2014-5-21 下午02:32:49
 * @version: 1.0
 */
public class TokenProcessor {

    /**
     * 生成一个令牌
     * @return String
     */
    public String generateToken()  {  
        String token=System.currentTimeMillis()+new Random().nextInt()+"";  
        try {  
            MessageDigest md=MessageDigest.getInstance("md5");  
            byte[] md5=md.digest(token.getBytes());  
            //base64编码  
            BASE64Encoder encoder=new BASE64Encoder();  
            return encoder.encode(md5);  
        } catch (NoSuchAlgorithmException e) {  
            // TODO Auto-generated catch block  
            throw new RuntimeException(e);  
        }  
    }  

    /**
     * 管理令牌
     * @param request
     * @param mType 管理类型 p:存放 d:删除
     * @param void
     */
    public void managerToken(HttpServletRequest request,String mType){
        if("p".equals(mType)){
            //产生随机数   
            String token=generateToken();  
            request.getSession().setAttribute("token", token); 
        }else if("d".equals(mType)){
            request.getSession().removeAttribute("token"); 
        }
    }

    /**
     * 令牌是否验证通过
     * @param request
     * @return boolean
     */
    public boolean isTokenValid(HttpServletRequest request) {
        String client_token = request.getParameter("token");
        if (client_token == null) {
            return false;
        }
        String server_token = (String) request.getSession().getAttribute("token");
        if (server_token == null) {
            return false;
        }
        if (!client_token.equals(server_token)) {
            return false;
        }
        return true;
    } 
}

然后在适当的位置存放令牌

  1. token.managerToken(request, “p”);//存放令牌  
token.managerToken(request, "p");//存放令牌

然后提交订单时删除对应的令牌存放值

  1. if(!token.isTokenValid(request)){  
  2.     logger.info(”重复提交,phoneNo:”+phoneNo);  
  3.     request.setAttribute(Constant.RETURNMSG, ”不能重复提交同一订单”);  
  4.     return checkresult;  
  5. }  
  6. token.managerToken(request, ”d”);//删除令牌  
               if(!token.isTokenValid(request)){
                    logger.info("重复提交,phoneNo:"+phoneNo);
                    request.setAttribute(Constant.RETURNMSG, "不能重复提交同一订单");
                    return checkresult;
                }
                token.managerToken(request, "d");//删除令牌









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值