Java防止表单重复提交

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

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

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

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

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;
	} 
}

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

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

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

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







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值