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

来源:互联网 发布:sql update 多个行 编辑:程序博客网 时间:2024/05/21 17:30

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中的格式是  前缀+keyString 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中的格式是  前缀+keyString 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秒验证时间、验证有没有发送成功为了安全或者其他的等等。如果项目安全性很高,需要再补充其他的东西。