烽火村游戏活动中心

HOME> 玩家社区> 邮箱验证激活账号

邮箱验证激活账号

2025-11-12 11:14:17

1. 流程

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

代码语言:javascript复制

org.springframework.boot

spring-boot-starter-parent

2.1.5.RELEASE

1.8

org.springframework.boot

spring-boot-starter-web

com.alibaba

druid

1.1.10

com.alibaba

druid-spring-boot-starter

1.1.10

org.springframework.boot

spring-boot-starter-jdbc

mysql

mysql-connector-java

5.1.28

org.mybatis

mybatis

3.4.6

org.mybatis.spring.boot

mybatis-spring-boot-starter

1.3.2

org.springframework.boot

spring-boot-starter-test

org.springframework.boot

spring-boot-starter-mail

SpringBoot配置文件

代码语言:javascript复制# 数据库连接池,自带hikari

# hikari:

# maximum-pool-size: 30 # 最大连接数

# minimum-idle: 10 # 最小连接数

# 自己的邮件配置

Howl:

mail:

from: XXXXXXXXXX@qq.com

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: XXXXXXXXXX@qq.com

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: true2. 项目结构3. 数据库代码语言:javascript复制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层代码语言:javascript复制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动态代理,编写的是接口代码语言:javascript复制@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. 工具类邮件工具类

代码语言:javascript复制@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 = "点击此处激活账号,有没有反应可以复制链接从浏览器打开";

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);

}

}

}激活码

代码语言:javascript复制@Component

public class CodeUtil {

public String getCode() {

//返回UUID

return UUID.randomUUID().toString().replace("-", "");

}

}7. Service层代码语言:javascript复制@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层代码语言:javascript复制@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入口代码语言:javascript复制@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 查看数据库激活状态总结

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

最新发表
友情链接