邮箱验证激活账号


1. 流程

  • 我们注册账号的时候会收到一封邮件,点击邮件里的链接就激活账号,这个功能很常见。其实就是在用户表里面加statecode字段,state表示激活状态,code是激活码
  • 用户填写账号点击注册,接着后台就往数据库插入数据,数据中state字段为0(表示未激活),还有个随机的code
  • 之后就向该用户发送邮件,邮件里有一个激活账号的URL(URL有用户id和对应的随机激活码)
  • 用户点击邮件的链接,就会带上用户id和激活码来到激活页面激活账号,若邮件的参数和数据库参数一致则激活账号,更新字段state未为1,否则不激活
  • 这里只介绍最基本的功能,还有激活码的过期时间,激活不成功删除账号,密码加盐等细节没有实现,还有这里的项目没有前端页面,一切功能从地址栏实现,请各位酌情考虑

2. 环境与依赖

  • IDEA
  • Maven

依赖

<!--  父工程  -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
</parent>

<!--  JDK版本  -->
<properties>
<java.version>1.8</java.version>
</properties>

<!--  各种依赖  -->
<dependencies>

<!--  Web启动类  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- 阿里巴巴数据库连接池  -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>
<!-- 连接池的启动器 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

<!--  添加数据库启动器  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--  数据库驱动,因为springboot不知道我们使用什么数据库  -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.28</version>
</dependency>
<!--  mybatis依赖  -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.6</version>
</dependency>
<!--  mybatis启动器依赖  -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.2</version>
</dependency>
<!--  Junit依赖  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--  邮件依赖  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

SpringBoot配置文件

# 数据库连接池,自带hikari
# hikari:
#   maximum-pool-size: 30   # 最大连接数
#   minimum-idle: 10        # 最小连接数

# 自己的邮件配置
Howl:
  mail:
    from: [email protected]
    subject: 激活邮件
    address: http://localhost:8080

spring:
  # 数据源
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?serverTimezone=UTC
    username: root
    password:
      druid:
        initial-size: 10
        min-idle: 5
        max-active: 20
        pool-prepared-statements: true

  # 邮件配置
  mail:
    host: smtp.qq.com
    port: 465
    username: [email protected]
    password: XXXXXXXXXXXXXXXXXX  #这里是smtp的密码,不是QQ密码
    protocol: smtp
    default-encoding: utf-8
    properties:
      mail:
        imap:
          ssl:
            socketFactory:
              fallback: false
        smtp:
          auth: true
          ssl:
            enable: true
            socketFactory:
              class: com.fintech.modules.base.util.mail.MailSSLSocketFactory
          starttls:
            enable: true
            required: true
      test-connection: false

# mybatis配置
mybatis:
  # 别名
  type-aliases-package: com.howl.dto
  # 映射文件路径,一般不用了
  # mapper-locations: classpath:mappers/*.xml
  configuration:
    # 开启驼峰映射
    map-underscore-to-camel-case: true

2. 项目结构

3. 数据库

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `password` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `state` int(1) NOT NULL DEFAULT '0' COMMENT '用户激活状态:0表示未激活,1表示激活',
  `code` varchar(255) NOT NULL COMMENT '激活码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

4. DTO层

public class User {

    private int id;
    private String username;
    private String password;
    private String email;
    private String state;
    private String code;

    //Getters、Setters
    //Constructor
}

5. DAO层

  • 使用mybatis动态代理,编写的是接口
@Mapper
public interface UserMapper {

    @Options(useGeneratedKeys = true, keyProperty = "id")
    @Insert("INSERT INTO user (`username`,`password`,`email`,`code`) VALUES (#{username},#{password},#{email},#{code})")
    public int register(User user);

    @Select("SELECT * FROM user WHERE id = #{id}")
    public User getUserById(int id);

    @Update("UPDATE user SET state = 1 WHERE id = #{id} AND code = #{code}")
    public int updateByIdAndCode(int id, String code);
}

6. 工具类

邮件工具类

@Component
public class EmailUtil {

    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${Howl.mail.from}")
    private String from;
    @Value("${Howl.mail.subject}")
    private String subject;
    @Value("${Howl.mail.address}")
    private String address;

    public void sendEmail(int id, String code, String to) {

        String url = address + "/verify?id=" + id + "&code=" + code;
        String label = "<a href=" + url + ">点击此处激活账号,有没有反应可以复制链接从浏览器打开</a>";

        try {
            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(label,true);
            messageHelper.setSentDate(new Date());
            javaMailSender.send(mimeMessage);
        }catch (Exception e){
            new RuntimeException("邮件发送失败",e);
        }
    }
}

激活码

@Component
public class CodeUtil {

    public String getCode() {

        //返回UUID
        return UUID.randomUUID().toString().replace("-", "");
    }
}

7. Service层

@Service
public class UserService {

    @Autowired
    UserMapper userMapper;
    @Autowired
    EmailUtil emailUtil;
    @Autowired
    CodeUtil codeUtil;

    public int register(String username, String password, String email) {

        int result;
        String code = codeUtil.getCode();
        User user = new User(username, password, email, code);
        result = userMapper.register(user);

        // 开线程来发邮件,提高效率,发邮件很慢
        new Thread(() -> {
            emailUtil.sendEmail(user.getId(), code, email);
        }).run();
        return result;
    }

    public int verify(int id, String code) {

        User user = userMapper.getUserById(id);
        if (user != null) {
            return userMapper.updateByIdAndCode(id, code);
        }
        return 0;
    }
}

8. Controller层

@RestController
public class UserController {

    @Autowired
    UserService userService;

    @GetMapping(value = "/register")
    public String register(String username, String password, String email) {
        return userService.register(username, password, email) + "";
    }

    @GetMapping(value = "/verify")
    public String verify(int id, String code) {
        return userService.verify(id, code) + "";
    }
}

9. SpringBoot入口

@SpringBootApplication
@MapperScan("com.howl.dao")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

10. 测试

都看到这里了,没有前端页面。。。大家自行想象登录操作

10.1 注册

这里使用地址栏GET方式注册,正式注册用POST表单的不要学我,为了懒不想写前端

10.2 数据库插入

10.3 收邮件

10.4 点击链接激活

10.5 查看数据库激活状态

总结

实现太简单,不过基本功能还是有的,细节方面可以慢慢补充

原文地址:https://www.cnblogs.com/Howlet/p/12198922.html

时间: 2024-08-02 20:07:44

邮箱验证激活账号的相关文章

演示账号激活的过程:注册——&gt;向指定邮箱发送邮件——&gt;用户登录邮箱,激活账号

今天无意间找到了大学时写的一个功能模块,整理了一把,没做太大的改动,不由得感慨--那时写的代码实在是......呵呵呵,不过这个模块的逻辑过程是对的,现将其贡献出来: 本工程用于演示账号激活的过程:注册-->向指定邮箱发送邮件-->用户登录邮箱,激活账号 本工程编码方式:UTF-8 须执行的sql语句: create database `test`; create table `user` ( `id` char(36) not null comment '用户id', `userName`

注册邮箱验证激活技术

一.先说思路 //1.数据库加三个字段,state:(0:未激活,1:激活成功),ActiCode:(放激活码),token_exptime(过期时间,用来验证激活邮件是否过期) //2.用户填写资料,点击注册,插入数据成功,state字段默认是0,同时生成一个ActiCode(用传过来的邮箱.密码.和当前时间加密形成)也存入数据库 //3.发送邮件...提示用户登录邮箱激活...邮件中带一个激活成功页的URL,URL里有两个参数(1,用户ID,2:激活码) //4.用户登录邮箱点击链接,来到处

ThinkPHP 3.2 用户注册邮箱验证激活帐号

本文将结合实例,讲解如何使用PHP+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. 3.将用户名密码或其他标识字符加密构造成激活识别码(你也可以叫激活码). 4.将构造好的激活识别码组成URL发送到用户提交的邮箱. 5.用户登录邮箱并点击URL,进行激活. 6.验证激活识别码,如果正确则激活帐号. 准备数据表 用户信息表中字段Email很重要,它可以用来验证用户.找回密码.甚至对网站方来说可以

Django用户注册、邮箱验证实践

算法流程如下:1)处理用户注册数据,存入数据库,is_activity字段设置为False,用户未认证之前不允许登陆2)产生token,生成验证连接URL3)发送验证邮件4)用户通过认证邮箱点击验证连接,激活is_activity字段,可以登录5)若验证连接过期,删除用户在数据库中的注册信息. #系统root邮箱 settings.py EMAIL_HOST = 'smtp.qq.com' EMAIL_HOST_USER = '17********@qq.com' #授权码 EMAIL_HOST

邮箱验证功能原理 语法 属性

邮箱验证功能原理 1 [已解决问题] 浏览: 3508次 很多地方都在注册账号的时候使用邮箱验证功能.注册后发送一封邮件到注册邮箱里面.然后点击 邮箱里面的链接 激活邮箱. 还有手机验证 这些的原理是 怎么样的.忘指点 .NET技术 ASP.NET yzy | 菜鸟二级 | 园豆:295 提问于:2012-03-20 18:26 < > 找找看 关注 最佳答案 2 这个其实就是通过第三方,将数据传递给用户,然后用户通过比如邮箱 来获取验证码,然后注册信息,起到一个比较安全的的作用..邮箱验证就

织梦如何开启邮箱验证并设定发送内容

一.开启邮箱验证 (1)打开织梦系统首页,进入系统—–系统基本参数—–核心设置,然后找到网站发信Email,在里面填入你发出验证邮件的邮箱地址,再找到SMTP服务 器,填入smtp.163.com(网易163)或者smtp.qq.com(QQ),或者其他.找到SMTP服务器的用户邮箱,填入你的邮箱地址,找到 SMTP服务器的用户帐号和用户密码,分别填入你邮箱的用户名和密码.smtp服务器端口默认为25,所以不用修改. (2)接下来就需要开启会员功能和邮箱验证功能.进入系统—-系统基本参数—-会员

JavaMail实现注册邮箱验证案例

在日常生活中,我们在一个网站中注册一个账户时,往往在提交个人信息后,网站还要我们通过手机或邮件来验证,邮件的话大概会是下面这个样子的:用户通过点击链接从而完成注册,然后才能登录. 也许你会想,为什么要这么麻烦直接提交注册不就行了吗?这其中很大一部分原因是为了防止恶意注册.接下来让我们一起来使用最简单的JSP+Servlet的方式来完成一个通过邮箱验证注册的小案例吧. 准备工作前提知识动手实践之前,你最好对以下知识有所了解: (1)JSP和Servlet(2)MySQL(3)c3p0(4)SMTP

在Maven项目中关于SSM框架中邮箱验证登陆

1.你如果要在maven项目中进行邮箱邮箱验证,你首先要先到pom.xml文件中配置mail.jar,activation.jar包 <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency> <dependency> <groupId

JavaMai——邮箱验证用户注册

这篇文章简单的模拟了网上利用邮箱激活用户注册这样的一个功能 1. 呈现给用户的注册界面:(为了简单起见,就剩下两个输入域,邮箱和昵称) [html] view plain copy print? <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01