本部分内容
这部分主要是从客户端输入网址到登录成功
进入主页
一般来说,输入的网址会被controller层拦截,但是如果在只输入了主机,没有输入其他的内容那么就会默认载入template中的index.html网页
点击登录
点击登录之后,浏览器构造请求体,发送给服务器,服务器进行解析
这里本来有前端代码,templates/index.html
,奈何鄙人能力有限,对前端知之甚少,40行为何就登录了实在是丈二和尚摸不着头,往大佬们不吝赐教。
后端捕获
src/main/java/com/geekq/miaosha/controller/LoginController.java
捕获到了登录请求,然后进行处理,接下来就是一行一行的谈一谈这几句话
行数作用40注解,匹配的请求41注解,有返回体42返回值,状态码,输入值请求体,表单内容43创建状态码(默认为成功)44日志中写入表单内容45调用userService进行登录46返回状态码
1.LoginController
@RequestMapping
首先说什么是Spring MVC,MVC是Model View Controller缩写
model是模型,在这儿就是Java相关的实体类
view是视图,在这儿是渲染出来的html网页
controller是控制器,在这儿是捕获请求之后进行处理的模块
那Spring MVC到底是怎么个工作流程
看图说话,服务器接收请求,请求进来了,由前端控制器接收,接收之后根据URL的内容,由分发器分发给其他的控制器,这个控制器处理请求,创建model返回给前端控制器,前端控制器从template文件夹中选取模板,进行渲染,返回给前端控制器,前端控制器向客户端返回response
requestmapping就是我们前端控制器分发给的控制器,怎么判断分发给谁呢,就是在requestmapping后面添加内容,URL去掉前缀,也就是主机,与requestmapping中的value值进行正则匹配,如果能够匹配上,就由该控制器匹配到的函数处理分发来的请求。
@ResponseBody
这个注解的作用是将这个函数对应返回值反序列化为JSON对象,并添加到HttpResponse对象中
ResultGeekQ
封装的一个返回结果类
dologin
这是个自己定的函数名,具体执行哪个函数由@RequestMapping value指定,跟这个函数名无关
@valid
是用来检验Bean的,检验发送方发送的数据是否有效,比如是不是为null,或者一些自定义的验证规则之类的
loginVo
是一个视图类实体,存储的是客户端传过来的用户名和密码
Logger
日之类。给日志里面写入用户名和密码。
2.UserService.login()
接着下沉到45行所在的服务层的登录函数,看看一看登录的逻辑
行数作用131-133如果是空就抛出系统错误异常(前端没检测到)133-135获取账号密码136-145由电话号码获取用户,redis没有就直接查数据库,如果没有电话或者密码不对就抛出异常147-148向response中添加token用于后续免密码登录
throw
终止运行后面的代码,直到有catch捕获了这个异常
MD5Utils.FormPassToDBPass
将密码和盐混合进行加密
Token
这儿是生成一个随机数用来当令牌,用以识别是不是同一个用户
addCookie
将cookie加入response,将token放到redis上
3.MiaoshaUser.getByNickName
行数作用60-63从redis获取用户,不为空则返回65-69从数据库获取用户,不为空则返回
4.RedisService.get
行数作用65prefix是过期时间+"nickname"66-68从jedisPool中获取资源70由"nickname"+传入的key得到真的key71由真的key获取到redis中的value72由字符串转换为实体类73-75try中return并不会真的return 而是在finally执行完了才return
redis能存储的数据有以下五种
一般来说都是存储的字符串
5.UserService.addCookie
行数作用179将“tk”+token作为key存入redis当做session180新建cookie创建token字段181设置cookie的最大过期时间182设置cookie的路径183将cookie加入response
总结
至此登录的流程已经到头了,不知道各位看官到底看没看懂呢?基本上事无巨细都给讲解了一遍,大家共同进步!