向目标(手机,邮箱)产生,发送,验证并管理验证码的一个类

package yyy.util;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * CheckManager具有自动回收过期,失效验证码功能<br>
 * 具体实现需要:<br>
 * 1、把验证码发送到具体的目标<br>
 * 2、设置两次发送的最小间隔<br>
 * 3、设置验证码的失效时间<br>
 * 单位为ms
 * @author wangzehao
 *
 */
public abstract class IdentityChecker {
	private static Map<String, IdentityChecker> target_checker_map = new HashMap<String, IdentityChecker>();

	private static int MAP_MAX_SIZE = 1024;

	private String checkCode;
	private long lastSendTime;
	private static long minimumTimeInterval;
	private static long invalidTime;

	public IdentityChecker() {
		minimumTimeInterval = minimumTimeInterval();
		invalidTime = invalidTime();
	}

	protected abstract long minimumTimeInterval();

	protected abstract long invalidTime();
	
	/**
	 * 
	 * @param target
	 * @return
	 * 如果不存在则返回null
	 */
	public static IdentityChecker getCheckerByTarget(String target){
		return target_checker_map.get(target);
	}

	/**
	 * 
	 * @param target
	 * @return
	 * 成功返回true,失败返回false
	 */
	final public boolean sendCheckCode(String target) {
		if (System.currentTimeMillis() - lastSendTime < minimumTimeInterval) {
			return false;
		} else {
			String checkCode = generateCheckCode();			
			if (target_checker_map.size() > MAP_MAX_SIZE) {
				collectGabage();
			}
			boolean sended= sendCheckCodeToTarget(target, checkCode);
			if(sended){
				lastSendTime=System.currentTimeMillis();
				target_checker_map.put(target, this);
				this.checkCode=checkCode;
			}
			return sended;
		}
	}

	private static int gabageCount;

	final private static void collectGabage() {
		long currentTime = System.currentTimeMillis();
		gabageCount = 0;
		target_checker_map.forEach((e, f) -> {
			if ((currentTime - f.lastSendTime) > invalidTime||f.checkCode==null) {
				target_checker_map.remove(e);
				gabageCount++;
			}
		});
		if (gabageCount == 0) {
			MAP_MAX_SIZE = MAP_MAX_SIZE * 2;
		}
	}

	protected abstract boolean sendCheckCodeToTarget(String target,
			String checkCode);

	/**
	 * 验证码只能使用一次<br>
	 * 返回true后验证码立即失效
	 * (不区分大小写)
	 * @param checkCode
	 * @return
	 * 如果checkCode有效返回true<br>
	 * 否则返回false
	 */
	final public boolean checkCheckCode(String checkCode) {
		if (this.checkCode != null && (System.currentTimeMillis()-lastSendTime)>invalidTime && this.checkCode.toLowerCase().equals(checkCode.toLowerCase())) {
			checkCode=null;
			return true;
		} else {
			return false;
		}
	}

	private static String generateCheckCode() {
		int length = 5;
		String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < length; i++) {
			int number = random.nextInt(62);
			sb.append(str.charAt(number));
		}
		return sb.toString();
	}
}


你可能感兴趣的:(向目标(手机,邮箱)产生,发送,验证并管理验证码的一个类)