java 后退防止重复提交

来源:互联网 发布:哪儿有淘宝号出售 编辑:程序博客网 时间:2024/05/19 00:08

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

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

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

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

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

[java] view plain copy
print?
  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;    } }

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

[java] view plain copy
print?
  1. token.managerToken(request, “p”);//存放令牌  
token.managerToken(request, "p");//存放令牌

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

[java] view plain copy
print?
  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
原创粉丝点击