仿牛客论坛项目02-注册激活功能,内容记录
发送邮件功能
导入邮件jar包
1 | <dependency> |
配置邮箱参数
1 | #MailProperties |
使用JavaMailSender
1 | public void sendMail(String to, String subject, String content) { |
注册功能
写功能时,可以将功能按照在浏览器中的请求,进行拆解
注册功能有三次请求:
- 访问注册页面
- 提交注册信息
- 通过表单提交数据
- 服务端验证账号是否注册过
- 服务端发送激活邮件
- 激活注册账号
- 点击邮件中的链接,访问服务器中的激活服务
当用户在前端页面上点击注册时,前后端会发生什么:
- 用户点击注册按钮,浏览器发送GET请求到
/register
。 - Spring MVC的
DispatcherServlet
接收请求,并找到对应的Controller方法。 - Controller方法返回视图名,视图解析器解析视图并渲染
register.html
页面。 - 浏览器显示
register.html
页面,用户填写表单并提交。 - 浏览器发送POST请求到
/register
,包含用户的注册信息。 - Controller处理POST请求,保存用户信息,并返回响应。
访问注册页面
该功能不需要Service
层和Dao
层,写controller
层,前端从index
页面点击头部的注册跳转到注册页面
Controller
:
1 |
|
前端标签复用:在index
页面中修改头部注册的路径,并将index的头部模板复用,在注册页面中引入(thymeleaf
语法)
提交注册信息
Service
层:写注册业务,包括:检查数据的合法性,设置User
的其他属性,插入用户,发送激活邮件
Controller
层:调用Service
层,需要接收注册的POST
请求
operator-result.html
:操作后进行跳转,提示信息和跳转链接需要由Controller
层传入
register.html
:修改表单,提交数据;注册失败时返回这个页面,页面上要有填入的注册信息以及失败提示。
激活注册邮件
改变数据库中的用户状态
Service
层:实现激活逻辑,激活时会传给服务器,激活的用户和激活码。
Controller
层:调用Service
层,激活成功后,给用户提示,并跳转到目标页面;当激活成功时,需要跳转到登陆页面,因此该层还需要写登录页面
问题
注册时在前端对属性进行校验了,为什么了在后端
Service
层还要校验?前端校验容易被绕过。用户可以禁用JavaScript、使用浏览器开发者工具修改前端代码等直接向服务器发送请求。所有进入数据库的数据必须在后端经过严格的校验,以防止出现数据异常。
自我拷问:说说注册模块
- 用户点击首页上的注册按钮,服务端响应注册页面
- 用户在注册页面上,需要填写账号、密码、邮箱,最后点击注册页面,服务端接收到该
Post
请求,验证账号、邮箱的合理性。 - 若账号邮箱为空或已注册过,返回相关错误信息,跳转到注册页面
- 若账号邮箱没有问题,将密码加上盐进行加密,存入数据库中,跳转到操作结果页面。
- 服务端发送激活邮件给用户,用户点击邮件后,服务端判断激活码是否正确,若正确将该用户状态设置为激活,跳转到登录页面。