0%

仿牛客论坛项目02-注册激活功能

仿牛客论坛项目02-注册激活功能,内容记录

发送邮件功能

导入邮件jar包

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>2.7.0</version>
</dependency>

配置邮箱参数

1
2
3
4
5
6
7
8
#MailProperties
spring.mail.host=smtp.sina.com
spring.mail.port=465
spring.mail.username=newcodergxy@sina.com
# 邮箱授权码
spring.mail.password=xxx
spring.mail.protocol=smtp
spring.mail.properties.mail.smtp.ssl.enable=true

使用JavaMailSender

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public void sendMail(String to, String subject, String content) {
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);

mailSender.send(helper.getMimeMessage());
} catch (MessagingException e) {
logger.error("发送邮件失败:" + e.getMessage());
}
}

注册功能

写功能时,可以将功能按照在浏览器中的请求,进行拆解

注册功能有三次请求:

  1. 访问注册页面
  2. 提交注册信息
    • 通过表单提交数据
    • 服务端验证账号是否注册过
    • 服务端发送激活邮件
  3. 激活注册账号
    • 点击邮件中的链接,访问服务器中的激活服务

当用户在前端页面上点击注册时,前后端会发生什么:

  1. 用户点击注册按钮,浏览器发送GET请求到/register
  2. Spring MVC的DispatcherServlet接收请求,并找到对应的Controller方法。
  3. Controller方法返回视图名,视图解析器解析视图并渲染register.html页面。
  4. 浏览器显示register.html页面,用户填写表单并提交。
  5. 浏览器发送POST请求到/register,包含用户的注册信息。
  6. Controller处理POST请求,保存用户信息,并返回响应。

访问注册页面

该功能不需要Service层和Dao层,写controller层,前端从index页面点击头部的注册跳转到注册页面

Controller

1
2
3
4
@RequestMapping(path = "/register", method = RequestMethod.GET)
public String getRegisterPage(){
return "/site/register";
}

前端标签复用:在index页面中修改头部注册的路径,并将index的头部模板复用,在注册页面中引入(thymeleaf语法)

提交注册信息

Service层:写注册业务,包括:检查数据的合法性,设置User的其他属性,插入用户,发送激活邮件

Controller层:调用Service层,需要接收注册的POST请求

operator-result.html:操作后进行跳转,提示信息和跳转链接需要由Controller层传入

register.html:修改表单,提交数据;注册失败时返回这个页面,页面上要有填入的注册信息以及失败提示。

激活注册邮件

改变数据库中的用户状态

Service层:实现激活逻辑,激活时会传给服务器,激活的用户和激活码。

Controller层:调用Service层,激活成功后,给用户提示,并跳转到目标页面;当激活成功时,需要跳转到登陆页面,因此该层还需要写登录页面

问题

  1. 注册时在前端对属性进行校验了,为什么了在后端Service层还要校验?

    前端校验容易被绕过。用户可以禁用JavaScript、使用浏览器开发者工具修改前端代码等直接向服务器发送请求。所有进入数据库的数据必须在后端经过严格的校验,以防止出现数据异常。

  2. 自我拷问:说说注册模块

    • 用户点击首页上的注册按钮,服务端响应注册页面
    • 用户在注册页面上,需要填写账号、密码、邮箱,最后点击注册页面,服务端接收到该Post请求,验证账号、邮箱的合理性。
    • 若账号邮箱为空或已注册过,返回相关错误信息,跳转到注册页面
    • 若账号邮箱没有问题,将密码加上盐进行加密,存入数据库中,跳转到操作结果页面。
    • 服务端发送激活邮件给用户,用户点击邮件后,服务端判断激活码是否正确,若正确将该用户状态设置为激活,跳转到登录页面。