接着验证码记录 ,此次写的是邮箱验证码;本文工具类是参考别人的,然后根据自己业务调整的,此处只是记录,非原创(距离开发有段时间了,所以原创地址没有了,在此向原创表示歉意)
1、使用场景
根据用户邮箱进行验证码接收和验证
2、步骤
2.1、前端输入邮箱,点击发送验证码,
2.2、服务器校验用户邮箱是否正确,如果正确:发送验证码,
2.3、用户邮箱收到验证码后,前端输入调用服务器接口,
2.4、服务器校验验证码,返回校验结果
注:一般验证码验证是整和在业务中的,所以前端传验证码时可能会传入其他业务参数,然后服务端验证验证码后,进行业务处理,修改密码邮箱等等,这需要具体业务具体分析
另:需要引入的包,本文不在给出,可根据引入包自行导入
发送邮件的邮箱开通过程此处不再给出,可自行百度
工具类
package com.*******.util.email; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; import java.util.HashMap; import java.util.Map; import java.util.Random; /** * 功能描述:
* 〈邮箱发送验证码〉 * 业务要求:可以修改发件邮箱,所以此处给出的参数存在数据库内的 * @return: * @since: 1.0.0 * @Author: * @Date: */ public class EmailUtil { //为了保证参数没有存入数据库的也可以使用,此处并未删除参数变量 //标题 private static String TITLE="邮箱验证"; //验证码 private static String CONTENT="验证码"; //发送邮箱的SMTP服务器 //邮箱的SMTP服务器,一般123邮箱的是smtp.123.com,qq邮箱为smtp.qq.com //设置邮箱的SMTP服务器,登录相对应的邮箱官网,去拿就行了 private static String HOSTNAME="smtp.163.com"; //发送信息的字符类型 private static String CHARSET="utf-8"; //发送邮箱 private static String SENDEMAIL="*******@163.com"; //发送人用户名 private static String USERNAME="***集团"; //授权用户名和授权码,申请开通 private static String AUTHENTICATION_NAME="******@163.com"; private static String USERNAME_PWD="*****"; //集合——保存验证码的集合 private static MapemailMap=new ConcurrentHashMap<>(); //过期时间 private static final long expiredTime=1000*10*60; /** *发送验证码 * @param receiveEmail * @param dto *@return () *@throws *@author yutf *@date 2020/5/23 * */ public static void sendEmail(String receiveEmail, EmailSettingDO dto) throws EmailException { //创建一个HtmlEmail实例对象 HtmlEmail email=new HtmlEmail(); //邮箱的SMTP服务器,一般123邮箱的是smtp.123.com,qq邮箱为smtp.qq.com //设置邮箱的SMTP服务器,登录相对应的邮箱官网,去拿就行了 // email.setHostName(HOSTNAME); email.setHostName(dto.getHostName()); //设置发送的字符类型 email.setCharset(CHARSET); //设置收件人 email.addTo(receiveEmail); //发送人的邮箱为自己的,用户名可以随便填 //email.setFrom(SENDEMAIL,USERNAME); email.setFrom(dto.getSendMail(),dto.getUserName()); //设置发送人的邮箱和用户名和授权码(授权码是自己设置的) //email.setAuthentication(AUTHENTICATION_NAME,USERNAME_PWD); email.setAuthentication(dto.getAuthenticationName(),dto.getUserNamePwd()); //设置发送主题 //email.setSubject(TITLE); email.setSubject(dto.getTitle()); //生成验证码 String code = String.valueOf(new Random().nextInt(899999) + 100000); //设置发送内容 //email.setMsg(CONTENT+code); email.setMsg(dto.getContent()+":"+code); //进行发送 email.send(); //保存验证码 SendEmailDO sendEmailDO=new SendEmailDO(); sendEmailDO.setCode(code); sendEmailDO.setSendTime(System.currentTimeMillis()); emailMap.put(receiveEmail,sendEmailDO); } /** * 功能描述:
* 〈验证验证码〉 * @return: * @since: 1.0.0 * @Author: * @Date: */ public static boolean verifyCode(String email,String code ){ //清理集合中过期的验证码 cleanEmailMap(); //如果集合中存在符合条件的验证码则返回true,否则false if(emailMap.containsKey(email)){ if(emailMap.get(email).getCode().equals(code)){ return true; } } return false; } /** *清理验证码集合 * @param *@return () *@throws *@author yutf *@date 2020/5/23 * */ public static void cleanEmailMap() { //如果集合不为空 if(!emailMap.isEmpty()){ //循环集合;当前时间-验证码创建时间大于过期时间则清理验证码 for (Map.EntrystringSendEmailDOEntry : emailMap.entrySet()) { if((System.currentTimeMillis()-stringSendEmailDOEntry.getValue().getSendTime())>expiredTime){ emailMap.remove(stringSendEmailDOEntry.getKey()); } } } } public static void main(String[] args) throws EmailException { String verifyCode = String .valueOf(new Random().nextInt(899999) + 100000);//生成短信验证码 System.out.println(verifyCode); //sendEmail("*******@qq.com","23443"); } }
实体类
package com.******.util.email; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * Author tyf * Date 2019-12-19 */ @ApiModel(value = "邮箱设置实体") @Data public class EmailSettingDO implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键(数据库自增)",name ="id",example = "1",notes = "自增主键在新增时无需传入") private long id; @ApiModelProperty(value = "主机名",name ="hostName") private String hostName; @ApiModelProperty(value = "邮箱地址",name ="sendMail") private String sendMail; @ApiModelProperty(value = "用户名",name ="userName") private String userName; @ApiModelProperty(value = "密码",name ="userNamePwd") private String userNamePwd; @ApiModelProperty(value = "授权名",name ="authenticationName") private String authenticationName; @ApiModelProperty(value = "标题",name ="title") private String title; @ApiModelProperty(value = "内容",name ="content") private String content; }
map 保存实体
package com.*******.util.email; import lombok.Data; import java.io.Serializable; @Data public class SendEmailDO implements Serializable { private String code; private Long sendTime;//如果使用localDateTime 请参考 上一边 验证码 }
此处根据自己的业务将相应的代码给出作为大家参考——主要是业务应用,不会吧相关所有代码给出
/** * 获取邮箱验证码 * @param email * @return */ @GetMapping("/sendEmailCode") @ApiOperation(value = "获取邮箱验证码") R sendEmailCode( String email) throws Exception {//此处报异常是因为应用了全局异常拦截,不建议如此使用,建议try catch 拦截 输出错误 Listlist = emailSettingService.list(new HashMap<>());//此处查询邮箱设置参数 if(list!=null&&!list.isEmpty()){ EmailSettingDO emailSettingDO = list.get(0); EmailUtil.sendEmail(email,emailSettingDO); return R.ok(); } return R.error(); } /** * 修改邮箱 * @param params * @return */ @PutMapping("/updateEmail") @ApiOperation(value = "修改邮箱") R updateEmail( @RequestBody Map params) throws Exception { String code=params.get("code").toString(); String email=params.get("email").toString(); boolean b = EmailUtil.verifyCode(email, code); if(b){ UserDO user =new UserDO(); user.setUserId(getUser().getId()); user.setEmail(email); user.setGmtModified(getCurrentTime()); return R.operate(userService.updateUserInfo(user) > 0); } return R.error("验证码错误"); }