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

1 篇文章 1 订阅
订阅专栏

流程图片

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() {
        @Override
        protected 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 {
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private BCryptPasswordEncoder encoder;
    @Autowired
    private 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);
        // 设置用户状态为false
        member.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>
AI在电商中的应用系列文章
程序员光剑
10-03 1029
作者:禅与计算机程序设计艺术随着互联网的发展和普及,越来越多的人把目光投向了电子商务这个新领域。许多企业都希望通过这个平台让顾客得到更高品质的服务和体验,从而实现自己的盈利目的。同时,电商也受到了人们的青睐,它给用户带来的便捷感、快速购买、低廉价格以及便于使用的优点,都令人印象深刻。基于这些原因,当下越来越多的企业开始在电商中积极布局,而在大数据、人工智能等新兴技术的驱动下,许多电商公司也纷纷开始了探索和尝试,尝试利用人工智能技术来提升产品的个性化推荐、商品分类以及品牌营销等方面。然而,对于如何将电商中的人
Java 实现邮箱发送验证验证登录
qq_44082755的博客
10-10 1297
在进行登录时候,可以在后端对存入在redis的数据获取,并于前端传递的验证码参数比较,成功则登录成功,反之登录失败。该功能还可以用于邮箱的注册等。,开启成功后会获得一个授权码,记录下来(代码中需要使用,这个授权码并不是一定的 )/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。打开Pop3/SMPT服务 ,获取邮箱授权码(需要手机验证),点击账户,下拉找到。
SpringBoot实现邮箱验证
Kristabo的博客
04-03 1320
2、点击生成授权码(这边已经开启IMAP/SMTP服务,未开启的要先设置为开启),之后根据指示可以拿到一串由邮箱服务器提供的专属于自己的授权码,用于在Java代码中连接邮箱。1、登录邮箱(以qq邮箱为例),点击邮箱右上角邮箱-设置-常规-第三方服务,会有如下选项。说明验证码在Redis中存储有效。成功接收到来自发送方的验证码。
邮箱验证登录
最新发布
小米队长的博客
06-28 341
1、允许用户使用邮箱登录2、登录时校验邮箱的有效性。
登录界面——邮箱验证
m0_58822223的博客
06-09 644
<html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>个人相册</title> .
实现邮箱登录验证
hzwCXYer的博客
07-25 3695
1.创建mailLogin.jsp &lt;%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&gt; &lt;% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServe...
具有邮箱验证登录系统
04-29
具有邮箱验证登录系统,初次登录时候可发送加密邮件进行验证,而且带有验证码校验功能,可防止而已注册。就是一个Demo,没有太多功能,邮箱等都在配置文件里面配置
使用邮箱验证实现登录功能(发送邮件,redis)
maohe的博客
02-28 4039
邮箱发送验证码用来验证登录功能,使用缓存redis实现。
柠檬班车载测试视频课程-课程网盘链接提取码下载 .txt
06-06
### 柠檬班车载测试视频课程知识点概览 ...无论是希望入门学习还是进一步深化技能的朋友,在这里都能找到满足自己需求的内容。希望每位参与者都能够充分利用好这次学习机会,成为一名优秀的车载测试视频制作者!
[网络安全自学篇] 二十一.GeekPwn 2019极客大赛之安全攻防技术总结及ShowTime
热门推荐
杨秀璋的专栏
11-04 1万+
这是作者的系列网络安全自学教程,主要是关于网安工具和实践操作的在线笔记,特分享出来与博友共勉,希望您们喜欢,一起进步。这篇文章主要分享作者10月24日参加上海GeekPwn极客大赛的体会,包括各种安全技术、ShowTime及疑惑。作者尽量还原当时的现场情景,以观众第一视角,带着网络安全初学者的无数疑问,并查询资料分享一些技术点。写这篇文章不容易,花费了两部手机电量,许多笔记、照片和资料完成,希望您喜欢,不喜勿喷~
个人登录邮箱验证
09-03
个人写的简易邮箱验证,包含JDBC数据库操作,调用邮箱验证接口
邮箱验证--javamail的简单使用
07-13
NULL 博文链接:https://lei-liao0826.iteye.com/blog/746663
asp+dw8轻松开发网站,asp入门,网页设计
05-28
【ASP技术详解】 ASP(Active Server Pages)是微软推出的一种服务器端脚本环境,用于创建动态交互式网页。它允许开发者结合HTML、VBScript或JScript等语言来编写服务器端的脚本,实现数据处理、用户交互等功能。...
乱的笔记
weixin_34357962的博客
03-22 1万+
链接:https://pan.baidu.com/s/1jBlX2OoWALMaLuMkx21H7w 提取码:mzl4 复制这段内容后打开百度网盘手机App,操作更方便哦如果看的不舒服可以上百度网盘下载完整的 第二本书 一、Linux基本命令1.基础命令 vi /etc/sysconfig/network-scripts/ifcfg-ens32DNBBOT=NO改成DNBBOT=YES//...
email邮箱登陆验证实例
ztt0918的博客
07-24 824
html> html lang="en"> head> meta charset="UTF-8"> title>title> script> window.onload=function(){ //使用getElementBId获取Email和密码 var email=document.getElementBy
实现注册邮箱验证和登陆验证
weixin_34090643的博客
05-25 7994
Django发送邮件 需要使用到模块 from django.core.mail import send_mail,send_mass_mail SMTP为邮件服务器,每一种邮箱smtp服务器地址不一样,自行百度 如163邮箱为smtp.163.com 一、在settings中添加配置 TEMPLATES = [ { 'BACKEND': 'django.templat...
什么是邮箱短息登录验证,如何开启或关闭?
naite123456的博客
03-16 1350
短信登录验证是指:企业邮箱用户登录时需要输入帐号的密码及绑定的手机收到的验证码方可登录,达到加强帐号安全的目的。 开启短信验证前,请先绑定手机号码。 方法一:通过密保平台绑定手机号码后,开启短息验证服务。 第一步:进入密保平台首页登录Webmail端企业邮箱后,进入应用中心,点击“密保平台”;或直接访问密保平台并登录; 二步:点击“短信验证”即进入手机绑定页面,根据系统提示绑定手机号码。第三部:返回密保平台首页,点击“开启短信验证”即可。【如何申请企业邮箱】 方法二:联系管理员,由管理员在管理后台
邮箱验证流程与token生成
weixin_46949627的博客
05-08 2063
邮箱验证流程与token生成

全栈领域优质创作者

580
原创
3986
点赞
5711
收藏
3万+
粉丝
关注
私信
写文章

热门文章

  • Linux(CentOS-7)-全面详解(学习总结---从入门到深化) 23309
  • Spring Cloud Alibaba【什么是Nacos、Nacos Server下载安装 、Docker安装Nacos Server服务、微服务聚合父工程构建】(一) 11862
  • Lombok-全面详解(学习总结---从入门到深化) 11172
  • Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compil 9751
  • Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化) 9595

分类专栏

  • Spring全家桶 付费 86篇
  • 中间件大全---全面详解 付费 105篇
  • 亿级高并发电商项目---前后端分布式 付费 16篇
  • 实战项目---分布式医疗云平台 付费 24篇
  • 前端系列---从入门到深化 付费 101篇
  • Python办公自动化 9篇
  • 情感解忧杂货铺 1篇
  • AIGC人工智能 6篇
  • Java基础深化和提高 75篇
  • 项目部署(阿里云版) 10篇
  • 微信小程序 6篇
  • leetcode算法题 4篇
  • 若依框架 64篇
  • Linux 11篇
  • 微信支付 1篇
  • Docker 1篇
  • 登录邮箱验证 1篇
  • C# 1篇
  • MySQL 9篇

最新评论

  • Shiro-全面详解(学习总结---从入门到深化)

    Tulipes: shiro的拦截规则其中map类型得是LinkedHashMap吧,得保证顺序

  • Java中把word转换成图片

    神奇的猿: options.setPageIndex(i); 有这个属性吗?

  • 若依框架----图标(可能不全)css

    杨XL: 这个应该再哪个文件里加这些图标呢?找不到位置?

  • 若依框架----源码分析(@RateLimiter)

    诸葛博仌: 大佬表情包表情包

  • vue 语音播报(文字转语音)

    qq_31160493: mac系统,没有声音是咋回事

最新文章

  • TypeScript【第三方声明文件、自定义声明文件、tsconfig.json文件简介、tsconfig.json 文件结构与配置】(六)-全面详解(学习总结---从入门到深化)
  • TypeScript【泛型1、泛型2、声明合并、命名空间 、模块1、模块2、声明文件简介】(五)-全面详解(学习总结---从入门到深化)
  • TypeScript【可选属性、只读属性、额外的属性检查、函数类型、类类型、继承接口】(四)-全面详解(学习总结---从入门到深化)
2023年422篇
2022年80篇
2021年82篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

童小纯

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家工业玻璃钢花盆哪家好唐山玻璃钢广场雕塑定制不锈钢太湖石玻璃钢仿铜雕塑设计玻璃钢制品贵阳玻璃钢雕塑定做厂宁波供应玻璃钢造型雕塑玻璃钢基督教雕塑费用商场美陈安全方案美容店商场美陈安庆玻璃钢雕塑电话哪里有玻璃钢仿铜雕塑加工广西户外景观玻璃钢雕塑吉林抽象玻璃钢雕塑图片徐州卡通玻璃钢雕塑济宁玻璃钢雕塑商家黄山欧式玻璃钢雕塑生产厂家129玻璃钢雕塑厂家玻璃钢火龙果雕塑厂商场美陈主管玻璃钢雕塑如何养护开封玻璃钢艺术雕塑定制厂家山西动物玻璃钢雕塑方法封开玻璃钢卡通雕塑价格中山发光玻璃钢雕塑商场扶梯美陈杭州仿铜西式玻璃钢雕塑商场美陈全面启动临夏玻璃钢雕塑人物四川佛像玻璃钢雕塑玻璃钢雕塑水泥批底香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化