牛客后端项目(3)-登录模块开发

登录模块,比注册做起来熟练了,项目开发中的小细节很多

会话管理

Cookie是HTTP的标准,Session是JavaEE的标准,Session还是基于Cookie的。

设置Cookie:一个cookie是一个键值对,需要对response添加cookie才会送到浏览器去。生存时间默认是关了浏览器就不在了。

设置Session:SpringMVC的控制器方法中作为参数直接获得,首次访问服务器时会生成一个sessionId并作为cookie保存到浏览器,下一次访问服务器时会携带这个sessionId对session内容进行读取

Session在分布式服务器遇到的问题:分布式服务器一般会使用负载均衡策略,当浏览器首次访问时,假设此时在服务器A上创建了一个Session,而浏览器再次访问时可能会由其他服务器B进行处理,而服务器B可能没有session,此时就会出错。
解决办法:

  1. 对于同一个浏览器请求,每次由同一个服务器处理。缺点:有悖“负载均衡”
  2. 在所有服务器上都有一个Session备份。缺点:同步耗时、占用空间
  3. 把所有Session存在一个单体服务器上。缺点:有悖“分布式”,只能访问一个服务器不仅会产生性能瓶颈,还有挂掉的风险
  4. 将数据放到数据库上,同时为了减小例如Mysql数据库要读硬盘的性能影响,用NoSql数据库,如Redis。

登录模块

需求:用户输入用户名、密码、验证码,进行验证与登录。

设计一个数据结构来记录登录状态,ticket作为登录凭证,用expired记录过期时间,login_ticket表结构
字段名:id, user_id, ticket, status, expired

登录流程图

跟着流程写就行,注意:

  1. 验证码在controller处判断即可,如果有错可以提前返回;
  2. “记住我”选项,无非就是控制登录有效时间的长短;
  3. 合法性判断不要漏情况了

密码加密问题

看视频的时候下面有同学留言说前端向后端传输时的密码依然可以被抓包,于是去查了一下资料。

  1. 后端的加密是必须的,不然一旦数据泄露,数据库信息就是裸露的,密码就透露出去了。后端的操作聚焦于密码存储的安全性。
  2. 虽然使用https传输时是密文传输,但中间人可以通过伪造证书来抓包。此时可以在前端用一个加密,比如RSA
    参考:目前主流靠谱的登录密码加密流程是怎样的? - SegmentFault 思否

显示登录信息

需求:导航栏功能显示会与登录状态相关,eg. 登录后就不显示注册功能了;登录后才显示个人信息。

拦截器

当很多请求都需要完成相同的功能时,可以用spring中的拦截器拦截请求进行处理。

拦截器,实现接口HandlerInterceptor,有三个方法preHandle、postHandle、afterCompletion,分别是进入控制器前,控制器完成后而视图解析前,全部完成后。

问题

  1. 每次请求时都要新建一个ThreadLocal来放User,这样性能影响会大吗?
    ThreadLocal创建一个线程局部变量,可以说就是个变量,不会很大影响性能的。

  2. 拦截器与过滤器的区别
    在JavaWeb中学过过滤器,想了一下不知道两者有啥区别,查了资料,看得一知半解…:
    过滤器 和 拦截器 6个区别,别再傻傻分不清了 - SegmentFault 思否

账号设置

上传头像

一些细节:

  1. 在表单处声明文件类型,multipart/form-data
  2. 用SpringMVC的Multipartfile方法,然后这个方法是视图层的,所以不要写到Service层了。
  3. 图像存在服务器,但是访问时是根据web访问路径。根据web访问路径的话需要有特定的控制器来处理。
  4. 在读取图像的时候,可以设置一个缓冲区来输出,能快一点

图像合法性验证

参考:在SpringBoot中验证用户上传的图片资源 - 掘金

密码修改

Service:输入userid、原密码和新密码,判断原密码和数据库中的是否相等;相等再继续,向数据库中修改新密码。

检查登录状态

需求:有的页面如果没登录是不能访问的,如账号设置等,一个一个页面添加规则有点麻烦,可以对需要拦截的方法进行注解。然后在拦截器中对这些被注解的方法进行拦截。

  • 项目中有多个拦截器时,按照注册顺序来执行

自定义注解时用元注解来注解。
常用元注解:@Target, @Retenion, @Document, @Inherited。前两个是必须的,Target描述注解的范围,即注解可以用在哪。Retention用于描述注解的生命周期,表示需要在什么级别保存该注解,即保留的时间长短
参考:Java 元注解 - 傻不拉几猫 - 博客园