向邮箱发送验证码去验证邮箱或者密码等等

1.首先向邮箱发送一个验证码,其实向其他邮箱发送一份邮件比较简单,主要是要验证这个验证码

假设邮箱能收到验证

 //重新发送激活邮件
            Member member = UserConext.getCurrentMember();
            if(member == null){
                return JsonResultUtil.getErrorJson("请您先登录再重新发送激活邮件!");              
            }
            member = memberManager.get(member.getMember_id());
            if(member == null){
                return JsonResultUtil.getErrorJson("用户不存在,请您先登录再重新发送激活邮件!");                

            }
            if(member.getLast_send_email() != null && System.currentTimeMillis() / 1000 - member.getLast_send_email().intValue() < 5 * 60){
                return JsonResultUtil.getErrorJson("对不起,五分钟之内只能重新发送一次激活邮件!");               
            }
            Map<String, Object> sendResult = EmailUtil.sendMobileSms(key);
			int stateCode = Integer.parseInt(sendResult.get("smsContent").toString());
            EopSite site  = EopSite.getInstance();
            EmailModel emailModel = new EmailModel();
            emailModel.getData().put("username", member.getUname());
            emailModel.getData().put("sitename", site.getSitename());
            emailModel.getData().put("logo", site.getLogofile());
            emailModel.getData().put("stateCode", stateCode);
            emailModel.setTitle(member.getUname()+"您好,"+site.getSitename()+"会员绑定邮箱!");
            emailModel.setEmail(email);
            emailModel.setTemplate("reg_email_template.html");//用户看到的模板
            emailModel.setEmail_type("绑定邮箱");
            mailMessageProducer.send(emailModel);
            member.setLast_send_email(DateUtil.getDateline());
            memberManager.edit(member);
            return JsonResultUtil.getSuccessJson("邮件发送成功,请登录您的邮箱 " + member.getEmail() + " 进行查收!");

2.现在主要验证码怎么验证:

Map<String, Object> sendResult = EmailUtil.sendMobileSms(key);
int stateCode = Integer.parseInt(sendResult.get("smsContent").toString());

stateCode  是一个6位数的验证码 从EmailUtil类取到发送邮箱中


3.看看这个类EmailUtil怎么生成验证码的以及怎么验证的

/**
 * 邮箱验证码
 * @author 
 *
 *
 */
public class EmailUtil {
		//验证码session前缀
		private static final String SMS_CODE_PREFIX = "";
		
		public static Map<String, Object> sendMobileSms(String key) {
			
			Map<String, Object> result = new HashMap<String, Object>();
			
			try {
				
				//随机生成的动态码
				String dynamicCode = "" + (int)((Math.random() * 9 + 1) * 100000);
				String smsContent = "" +  dynamicCode;
				
				HttpSession session = ThreadContextHolder.getSession();// session中的格式是  前缀+key
				String codeSessionKey = SMS_CODE_PREFIX + key;
				session.setAttribute(codeSessionKey, dynamicCode);
//				System.out.println(smsContent);
				
				result.put("smsContent", smsContent);
			} catch(RuntimeException e) {
				TestUtil.print(e);
			}
			return result;
		}
		
		public static boolean validSmsCode(String validCode, String key) {
			//防止 空值
			if (key == null || "".equals(key)) {
				
				// 默认为登录
				key = SmsTypeKeyEnum.LOGIN.toString();	
			}
			
			// 如果验证码为空
			if (validCode == null || "".equals(validCode)) {
				return false;
			}
			String code = (String) ThreadContextHolder.getSession().getAttribute(SMS_CODE_PREFIX + key);
			
			// 验证码为空
			if (code == null) {
				return false;
			} else {
				
				// 忽略大小写 判断  不正确
				if (!code.equalsIgnoreCase(validCode)) {
					return false;
				}
			}
			//验证通过后  去除session信息
			ThreadContextHolder.getSession().removeAttribute(SMS_CODE_PREFIX + key);
			return true;
		}
		
}

(1.)这个类中有两个方法,一个sendMobileSms 是获取一个6位数的随机数

注意:这个验证码存在session中

//验证码session前缀
private static final String SMS_CODE_PREFIX = "";

HttpSession session = ThreadContextHolder.getSession();// session中的格式是  前缀+key
String codeSessionKey = SMS_CODE_PREFIX + key;
session.setAttribute(codeSessionKey, dynamicCode);

4.用户在拿到 6位数的验证码后提交验证

 //验证手机校验码的key值不能为空
        	 Member member = UserConext.getCurrentMember();
            if(StringUtil.isEmpty(key)){
                return JsonResultUtil.getErrorJson("出现错误,请重试!");
            }
            
            boolean result = EmailUtil.validSmsCode(validCode, key);
            
            //如果手机校验码错误
            if (!result) {
                return JsonResultUtil.getErrorJson("验证码错误");
            } else{
            	 memberManager.setEmial(email,member.getMember_id());
            	 return JsonResultUtil.getSuccessJson("邮箱绑定成功!");
            }

5.验证用户输入的验证码和发到邮箱的验证码是否一致

继续调用 类 EmailUtil

boolean result = EmailUtil.validSmsCode(validCode, key);

两个参数一个key,一个验证码validCode

public static boolean validSmsCode(String validCode, String key) {
			//防止 空值
			if (key == null || "".equals(key)) {
				
				// 默认为登录
				key = SmsTypeKeyEnum.LOGIN.toString();	
			}
			
			// 如果验证码为空
			if (validCode == null || "".equals(validCode)) {
				return false;
			}
			String code = (String) ThreadContextHolder.getSession().getAttribute(SMS_CODE_PREFIX + key);
			
			// 验证码为空
			if (code == null) {
				return false;
			} else {
				
				// 忽略大小写 判断  不正确
				if (!code.equalsIgnoreCase(validCode)) {
					return false;
				}
			}
			//验证通过后  去除session信息
			ThreadContextHolder.getSession().removeAttribute(SMS_CODE_PREFIX + key);
			return true;
		}
注意:此时就拿发出的验证和用户输入的验证匹配相等return true 

从session取值 

String code = (String) ThreadContextHolder.getSession().getAttribute(SMS_CODE_PREFIX + key);
// 验证码为空
if (code == null) {
return false;
} else {
// 忽略大小写 判断  不正确
if (!code.equalsIgnoreCase(validCode)) {
return false;
}
}
//验证通过后  去除session信息
ThreadContextHolder.getSession().removeAttribute(SMS_CODE_PREFIX + key);
return true;


ps.这里会有问题 超时没做判断 比如60秒验证时间、验证有没有发送成功为了安全或者其他的等等。如果项目安全性很高,需要再补充其他的东西。


猜你喜欢

转载自blog.csdn.net/whatisthespring/article/details/78733123