牛客后端项目(2)-注册模块开发

好久没更新啦!搞完科研搞项目了!!

使用Spring发送邮件

用到的依赖:Spring Boot Starter Mail

步骤:

  1. 在application.properties中配置。主要要配置:host、username、password及安全传输相关的配置。配置和相关内容见官方spring文档2.7.0版本
1
2
3
4
5
6
7
8
spring.mail.host=smtp.163.com
spring.mail.username=name
spring.mail.password=psw
spring.mail.protocol=smtps
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.auth=true
  1. 构建发送邮件的工具类。主要用到的类是JavaMailSender。
  2. 发送邮件。主要用到的类是MimeMessage

Spring中的Value注解

工具类中需要用到邮箱名字(即username)。Value注解的作用就是将配置中的属性读出来。有@Value("${}")@Value("#{}")两种方式,前者读的是配置文件中的内容,后者是SpEL表达式对应的内容(如,某个bean的属性),详见:spring的@Value注解使用_菊花超人的博客-CSDN

问题解决

在发送html格式的邮件时出现了乱码问题。而且在控制台输出结果时就乱码了,那么就不是传输过程中的编码问题。又试了别的html文件,发现输出是正常的。那就是这个文件可能在创建的时候用了别的编码,我把idea中文件编码格式全部换成UTF-8,然后重新创建一个html文件,就不乱码了。

展示!嘿嘿~
Img

注册模块的开发

复杂业务开发过程中,可以根据请求来拆解。

  1. 跳转到注册页面
  2. 注册用户。(1)需要提供的信息(用户名、密码、邮箱);(2)信息的约束(用户名和邮箱不允许重复);(3)返回的结果(错误信息提示与注册成功的跳转
  3. 激活账号。

跳转到注册页面

用一个控制器转发请求即可

注册用户☆

按照三层架构根据自己的理解整理了流程,先开发Service层处理逻辑我感觉比较好。
三层要干的事儿

Service层

按上图写就是了~

随机字符串生成:UUID
密码加密:对字符串后面接一个salt,再用MD5加密,MD5特点是无法解密;Spring中有对应方法实现了md5

问题解决

RequestMapping的路径书写
关于开头斜线的问题。之前写Servlet的时候好像一定得加,但是在Spring中可加可不加。因为在Spring中,web容器启动的时候spring会扫描并根据Controller注解找到所有Handler类,并且会遍历这些类找到所有带RequestMapping的方法,在这个过程中会对没有加斜线的路径自动拼接斜线。
参考:注解RequestMapping中的URI路径最前面到底需不需要加斜线?_hehuijava的博客-CSDN

密码、邮箱的合法性验证应在前端还是后端
在实现模块的时候,感觉合法性验证在开发中应该在前端的位置,这样用户体验感更好(能马上收到反馈),那这样一般在后端是不是就不需要实现了?
查了一下资料:一般在前端和后端都需要实现。前端为了用户体验,后端是数据处理的环节,必须对数据合法性进行保证以满足业务要求。
前端验证还是后端验证 - 简书

常量定义在类还是接口中?
在开发项目的时候需要为数字定义一个有含义的名字,就需要定义常量。我看的视频中老师用的方法是“常量接口模式”,但这种方法可能会导入一些用不到的常量。
而接口中声明的默认就是public static final的常量类型,所以代码会更简洁。而且生成的.class文件比类更小。
最佳实践:将常量定义在一个接口中,然后直接用接口名.常量名进行调用即可。
参考:关于 “java中常量定义在interface中好还是定义在class中好” 的一些思考_voo00oov的博客-CSDN

其他
在开发过程中,卡得最多的地方是thymeleaf🤣虽然说实际应用中前后端分离不太会用它,但现在卡着也多少有点浪费时间😅
主要会卡的地方:1. 总忘记加th:!!!2. 别的暂时没想到
另外,开发经验太少,总有种不敢写的感觉,写得一多就担心会出错。。慢慢来吧,这好像也没办法,这种思维是要锻炼的。

  • 区分“程序错误”与“业务逻辑错误”,前者throw异常,后者返回信息

    还可以优化的地方

  1. 验证码过期失效问题
  2. 激活成功后跳转应该自动登录了。

Controller层

向Service传user,调用注册方法,如果有错误信息就要向视图送,没有的话就重定向。这个也不太复杂。

激活邮箱

在注册模块完成了激活邮件的发送,链接是这样式儿的:
网站名/verify-email?uid=169&code=22e08a5605f14d30a534fa1d3f9e0dcf
get传的参数直接作为controller的参数名

注意要判断是不是已经激活了等,几个状态考虑全就行。