流程图片

1、邮箱验证登录

1.1、先去邮箱设置验证

1.2 编程JAVA

1、在pom中引入发送邮件依赖

<!-- 发邮件 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

2、在yml文件配置发件人用户名密码

# 发送邮件配置
mail:# 发件人地址user: 461618768@qq.com# 发件人密码password: yioaiekdcphnbije# 项目路径
project:path: http://localhost

3、引入邮件发送工具类

/*** 发邮件工具类*/
@Component
public final class MailUtils{@Value("${mail.user}")private String USER; // 发件人邮箱地址@Value("${mail.password}")private String PASSWORD; // 如果是qq邮箱可以使户端授权码/*** 发送邮件* @param to 收件人邮箱* @param text 邮件正文* @param title 标题*/public boolean sendMail(String to, String text, String title){try {final Properties props = new Properties();props.put("mail.smtp.auth", "true");props.put("mail.smtp.host", "smtp.qq.com");// 发件人的账号props.put("mail.user", USER);//发件人的密码props.put("mail.password", PASSWORD);// 构建授权信息,用于进行SMTP进行身份验证Authenticator authenticator = new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// 用户名、密码String userName = props.getProperty("mail.user");String password = props.getProperty("mail.password");return new PasswordAuthentication(userName, password);}};// 使用环境属性和授权信息,创建邮件会话Session mailSession = Session.getInstance(props, authenticator);// 创建邮件消息MimeMessage message = new MimeMessage(mailSession);// 设置发件人String username = props.getProperty("mail.user");InternetAddress form = new InternetAddress(username);message.setFrom(form);// 设置收件人InternetAddress toAddress = new InternetAddress(to);message.setRecipient(Message.RecipientType.TO, toAddress);// 设置邮件标题message.setSubject(title);// 设置邮件的内容体message.setContent(text, "text/html;charset=UTF-8");// 发送邮件Transport.send(message);return true;}catch (Exception e){e.printStackTrace();}return false;}
}

 4.Service层(发送方法)

package com.itbaizhan.travel.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.itbaizhan.travel.bean.Result;
import com.itbaizhan.travel.mapper.MemberMapper;
import com.itbaizhan.travel.pojo.Member;
import com.itbaizhan.travel.util.MailUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.UUID;@Service
public class MemberService {@Autowiredprivate MemberMapper memberMapper;@Autowiredprivate BCryptPasswordEncoder encoder;@Autowiredprivate MailUtils mailUtils;@Value("${project.path}")private String projectPath;// 注册public Result register(Member member) {// 1.保存用户// 验证用户名是否重复QueryWrapper<Member> queryWrapper = new QueryWrapper();queryWrapper.eq("username", member.getUsername());List<Member> members = memberMapper.selectList(queryWrapper);if (members.size() > 0) {return new Result(false, "用户名已存在");}// 验证手机是否重复QueryWrapper<Member> queryWrapper1 = new QueryWrapper();queryWrapper1.eq("phoneNum", member.getPhoneNum());List<Member> members1 = memberMapper.selectList(queryWrapper1);if (members1.size() > 0) {return new Result(false, "手机已存在");}// 验证邮箱是否重复QueryWrapper<Member> queryWrapper2 = new QueryWrapper();queryWrapper2.eq("email", member.getEmail());List<Member> members2 = memberMapper.selectList(queryWrapper2);if (members2.size() > 0) {return new Result(false, "邮箱已存在");}// 加密密码String password = member.getPassword();password = encoder.encode(password);member.setPassword(password);// 设置用户状态为falsemember.setActive(false);// 2.发送激活邮件// 生成激活码String activeCode = UUID.randomUUID().toString();// 给用户的邮箱发送一封邮件,该邮件包含一个链接,链接中包含激活码String activeUrl = projectPath + "/frontdesk/member/active?activeCode=" + activeCode;String text = "恭喜您注册成功!<a href = '" + activeUrl + "'>点击激活</a>完成账号认证";mailUtils.sendMail(member.getEmail(), text, "旅游网激活邮件");// 保存激活码,激活时比对member.setActiveCode(activeCode);// 保存用户memberMapper.insert(member);return new Result(true, "注册成功!");}// 激活用户public String active(String activeCode) {// 根据激活码查询用户QueryWrapper<Member> queryWrapper = new QueryWrapper();queryWrapper.eq("activeCode", activeCode);Member member = memberMapper.selectOne(queryWrapper);// 没有找到用户:激活失败if (member == null) {return "激活失败!激活码错误!";} else {member.setActive(true);memberMapper.updateById(member);return "激活成功,请<a href='" + projectPath + "/frontdesk/login'>登录</a>";}}public Result login(String name, String password) {Member member = null;// 根据用户名查询if (member == null) {QueryWrapper<Member> queryWrapper = new QueryWrapper();queryWrapper.eq("username", name);member = memberMapper.selectOne(queryWrapper);}// 根据手机查询if (member == null) {QueryWrapper<Member> queryWrapper = new QueryWrapper();queryWrapper.eq("phoneNum", name);member = memberMapper.selectOne(queryWrapper);}// 根据邮箱查询if (member == null) {QueryWrapper<Member> queryWrapper = new QueryWrapper();queryWrapper.eq("email", name);member = memberMapper.selectOne(queryWrapper);}// 没有查询到用户if (member == null) {return new Result(false, "用户名或密码错误");}// 验证密码boolean flag = encoder.matches(password, member.getPassword());if (!flag) {return new Result(false, "用户名或密码错误");}// 验证是否激活if (!member.isActive()) {return new Result(false, "用户未激活,请登录邮箱激活用户");}return new Result(true, "登录成功", member);}
}

5.激活方法

激活新用户,点击发送邮箱邮件

激活方法即拿到激活码,在数据库中根据激活码找到用户,将其状态改为true即可。

1、编写MemberService

// 激活用户
public String active(String activeCode){// 根据激活码查询用户QueryWrapper<Member> queryWrapper = new QueryWrapper();queryWrapper.eq("activeCode",activeCode);Member member = memberMapper.selectOne(queryWrapper);// 没有找到用户:激活失败if(member == null){return "激活失败!激活码错误!";}else {member.setActive(true);memberMapper.updateById(member);return "激活成功,请<a href='"+projectPath+"/frontdesk/login'>登录</a>";}
}

 2、编写MemberController

@RequestMapping("/active")
public ModelAndView active(String activeCode) {ModelAndView modelAndView = new ModelAndView();String active = memberService.active(activeCode);modelAndView.addObject("message",active);modelAndView.setViewName("/frontdesk/active_result");return modelAndView;
}

3.编写激活结果页面active_result.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"><head><meta charset="utf-8"><title>激活结果</title><link rel="stylesheet" type="text/css" href="/frontdesk/css/common.css"><link rel="stylesheet" href="/frontdesk/css/register.css"><!--导入jquery--><script src="/frontdesk/js/jquery-3.3.1.js"></script><style>.content {width: 100%;height: 585px;background: url(../images/register_bg2.png) no-repeat center;background-size: 100% 780px;overflow: hidden;text-align: center;font-size: 20px;}.content .box {width: 1000px;height: 550px;background-color: #fff;margin: 20px auto}.content .box p {width: 100%;height: 40px;line-height: 40px;background-color: var(--primary-color);text-align: center;color:#fff;}.content .box h4{margin-top: 150px;font-size: 20px;line-height: 70px;}.content .glyphicon{color: var(--primary-color);font-size: 55px;vertical-align: middle;margin-right: 20px;}</style>
</head><body><div class="simple_header"><div class="logo"><img src="/frontdesk/images/logo.png" alt=""></div><a class="link" href="index.html"><span class="glyphicon glyphicon-home"></span>首页</a></div><div class="content"><div class="box"><p>提示</p><h4><span th:utext="${message}"></span></h4></div></div>
</body>
</html>

邮箱验证登录-全面详解(学习总结---从入门到深化)相关推荐

  1. java后台验证不能为空_java validation 后台参数验证的使用详解

    一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间 ...

  2. 多维系统下单点登录深入详解

    多维系统下单点登录深入详解 1. 从淘宝天猫的单点登录说起 1.1 SSO单点登录 1.2 淘宝天猫登录场景解析 2. 单点登录之整体解决方案 2.1 设计方案-Cookie 2.2 设计方案-分布式 ...

  3. TCP/IP详解学习笔记-基本概念

    为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...

  4. 火狐浏览器账号登录步骤详解

    打开火狐浏览器,点击右上角的火狐账户图标,并选取登录; 火狐怎么登录账号?火狐浏览器账号登录步骤详解 火狐怎么登录账号?火狐浏览器账号登录步骤详解 输入点击右键地址,再按下"确定" ...

  5. 基础才是王道——TCP/IP详解学习笔记 这位仁兄写得太好了

    TCP/IP详解学习笔记 这位仁兄写得太好了 TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.as ...

  6. 如何获取QQ邮箱授权码——步骤详解

    获取QQ邮箱授权码步骤详解 1.打开QQ邮箱,进入邮箱账户设置界面 下滑当前界面,显示到邮箱服务区域,选择自己需要开启的协议服务 或点击下方提示中的生成授权码 点击开启,显示验证密保弹窗,根据提示进行 ...

  7. VC++深入详解学习笔记

    VC++深入详解学习笔记 Lesson1: Windows程序运行原理及程序编写流程 Lesson2: 掌握C++基本语法 Lesson3: MFC框架程序剖析 Lesson4: 简单绘图 Lesso ...

  8. TCP/IP详解学习笔记(1)-基本概念

    为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样 ...

  9. TCP/IP详解学习笔记

    [TCP/IP详解学习笔记(1)基本概念] 为什么会有TCP/IP协议? 计算机型号多种多样,并且运行于不同操作系统.虽然电线把计算机连接到了一起,但是这些计算机无法"交流",所以 ...

最新文章

  1. android+单利模式中传递context,Android的Context详解
  2. ORA-01078与LRM-00109报错解决
  3. mysql in sql注入_在 SQL 注入攻击中检查数据库
  4. Problem H: tmk买礼物
  5. android TextView EditTextView一些技巧使用 (视图代码布局)
  6. 白盒基本路径发测试实验报告_软件生命周期、白盒测试、黑盒测试
  7. 随笔之:VC操作Word系列(四)
  8. gcd常见结论及gcd与斐波那契结合--hdu6363.
  9. (5)通过输入参数(测量数据)构建二维体模型(01)
  10. sitemesh 2.4 装饰器学习
  11. A-priori算法
  12. Java编程笔记17:I/O
  13. 福建2021高考成绩查询是什么时间,2021年福建高考成绩排名及成绩公布时间什么时候出来...
  14. 主流智能手机屏幕材质介绍
  15. “爱心银行”让爱心增值(转自中国文明网)
  16. 碧光の鎌使い(シュゼット) / 碧镰(异时层中二)
  17. Python-Tkinter 基础教程
  18. Word怎么生成目录?4个方法快速生成目录!
  19. STM32驱动W5100实现udp通信
  20. 分别解释final,finally,finalize是什么?

热门文章

  1. 发表计算机SCI论文有查重要求吗? - 易智编译EaseEditing
  2. python判断邮件发送成功_【基本解决】python中用SMTP发送QQ邮件提示成功但是收件人收不到邮件...
  3. 相似图片搜索原理三(颜色直方图—c++实现)
  4. 【PostgreSQL】PG读取元数据获取表结构及字段类型信息(过程拆解及其他应用场景)...
  5. 【TypeScript入门】TypeScript入门篇——元组
  6. vue.js移动端记账本完成的总结(未完待续,电脑快没电了) 1
  7. 如何压缩图片jpg格式?一分钟学会jpg图片压缩
  8. ISE 启动Modelsim的xilinxcorelib_ver错误
  9. 苹果手机可以投影到墙上吗_手机投影到墙上(不用投影仪将手机画面投到墙)...
  10. python 源代码 macd双底 高 低_深入研究MACD:MACD双顶双底形态,成为高手的门槛...