1.如何实现项目的注册问题
用户注册对于开发人员来说就是在数据库表中插入一条新的用户数据。在我们这个项目中就是在user表中插入一条新数据,我们可以按照注册功能实现的以下三个请求来进行开发
我们对每一个请求的开发都是由Dao——>sevice——controller层
我们在插入数据前,会对数据进行空值验证,对账号邮箱进行重复性验证,使用map来存储错误信息,如果controller层拿到的map为空就说明注册成果,进行后续的激活处理。在插入数据时,会对密码进行加盐处理后,在使用MD5算法进行加密,然后存储到数据库,最开始的数据Status设为0,表示无效,需要进行激活处理。
激活逻辑:
2.项目如何实现用户唯一性检验
在创建MySQL表时,使用unqiue关键字保证用户名username字段的唯一性。另外,在注册用户时进行重复性验证,如果已经用户已经存在,不能进行注册。
3.项目的部署
4.项目中为什么要选用SpringBoot
用SpringBoot来简化项目的开发,Springboot具备以下优势:
一、独立运行
Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。
二、简化依赖
spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。
三、自动配置
Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。
四、无代码生成和XML配置
Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。
5.登录状态保存在哪
最开始考虑保存在数据库中
保存在用户凭证表,包括用户id,用户凭证,用户状态和过期时间,对于用户凭证表是0有效1无效。在登录时验证账号密码是否为空,或者密码是否错误等,如果没有错误就生成登录凭证,代码如下
后面用redis进行优化,将用户的登录凭证存入redis,如下:
6.用户登陆上之后怎么显示登录页面
根据登录与否,主页显示的信息会有不同。显示登录信息这个功能是一个共有的功能,对每一个请求都需要处理,所以采用拦截器来实现,集中统一的,以一个低耦合度的方式来处理。拦截器能够拦截浏览器访问过来的请求,然后处理每个请求共有的业务。
用户在登录后会以ticket为key,以及实际的ticket为value创建一个cookie存入浏览器,之后服务端根据用户凭证在用户凭证表中查询user信息封装在模板中然后返回给浏览器(后面用redis优化了,不是根据ticket在表中取,而是ticke是一个对象,它含有userId的成员属性!!,然后根据userId取user表中取user信息。redis将ticket序列化为字符串后存入。)。代码和流程如下图所示
这个过程是每一个用户登录都会存在的,所以我们需要拦截器来处理。同时对于服务端来说,同时可能会有大量的浏览器请求,所以这里还涉及到线程安全问题。
redis优化!!!! 将用户信息缓存到redis中,优先从缓存中取值:
拦截器:1.自定义拦截器 2.配置拦截器
首先验证用户
经过controller后,返回到拦截器,拦截器再将用户信息存入model
自定义拦截器需要实现HandlerInterceptor,然后重写preHandle(controller前执行),postHandle(controller后执行),以及afterCompletion(模板解析后执行)
配置拦截器:需要实现WebMvcConfigurer接口,然后重写addInterceptors方法,排除拦截静态页面。
采用ThreadLocal来保存用户信息,保证线程安全性
ThreadLocal源码:
从上面的代码可以看出,ThreadLocal set赋值的时候首先会获取当前线程thread,并获取thread线程中的ThreadLocalMap属性。如果map属性不为空,则直接更新value值,如果map为空,则实例化threadLocalMap,并将value值初始化
ThreadLocalMap是ThreadLocal的内部静态类,而它的构成主要是用Entry来保存数据 ,而且还是继承的弱引用。在Entry内部使用ThreadLocal作为key,使用我们设置的value作为value。
通过当前线程对象的getMap()方法获取ThreadMap对象 然后将当前ThreadLocal对象作为key值存入map 这能保证线程内的资源共享而不同线程之间独立
7.md5原理知道吗?安全吗?可逆吗?
可以将MD5算法看作一台机器,计算机的任何内容(字符串,图片,视频等)被丢进去都将输出一个长度为128比特的MD5值。
输入消息相同,结果也会始终相同,不同的消息,结果则不同。MD5原理简述:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5的安全性:普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上如果把用户的密码MD5处理后再存储到数据库,其实是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。因此在我们这个项目中,会将用户密码进行加盐处理(密码末尾加随机的字符串)然后再进行MD5加密存入数据库。
MD5是否可逆:不可逆,原因是MD5是一种散列函数,使用的是hash算法,在计算过程中原文的部分信息是丢失了的。