您的位置:首页 > 其它

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

2017-12-06 18:03 453 查看
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.setAt
4000
tribute(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,一个验证码validCodepublic 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秒验证时间、验证有没有发送成功为了安全或者其他的等等。如果项目安全性很高,需要再补充其他的东西。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐