
目录
一、登录功能
1、基础登录功能
①、SQL语句
②、接口参数
③、实现思路
④、实现步骤
2、联调Bug(没有Cookie或Session)
二、登录校验
1、登录校验的实现思路
2、会话技术
①、会话与会话跟踪
②、会话跟踪方案对比
Cookie
Session
令牌技术(主流方案)
3、JWT令牌
①、简介
②、应用场景
③、JWT - 生成
④、JWT - 校验
⑤、登录后下发令牌(用户成功登录的标记)
4、过滤器Filter
①、快速入门
②、详解(执行流程、拦截路径、过滤器链)
③、实现登录校验 - Filter
5、拦截器(Interceptor)
①、简介 & 快速入门
②、详解(拦截路径、执行流程)
③、实现登录校验 - Interceptor
三、异常处理
1、出现异常的不符合规范数据
①、示例
②、思考
③、全局异常处理器
④、小结
一、登录功能
1、基础登录功能
①、SQL语句
| SQL语句: 
 | 
| 查询结果: 
 | 
②、接口参数
| 基本信息: | 
| 
 | 
| 请求参数: | 
| 
 | 
| 响应数据: | 
| 
 | 
③、实现思路

④、实现步骤

具体实现:
| Ⅰ、Controller方法: | 
| 
 | 
| Ⅱ、Service方法: | 
| service接口: 
 service实现类: 
 | 
| Ⅲ、Mapper方法: | 
| 
 | 
| Ⅳ、Postman测试: | 
| 
 | 
2、联调Bug(没有Cookie或Session)
缺少登录校验:

二、登录校验

1、登录校验的实现思路
由于HTTP协议是无状态的,两次请求之间是独立的,所以它是无法判断用户是否登录成功的,我们可以通过 统一拦截 与 登录标记 的方式进行实现:

2、会话技术
①、会话与会话跟踪
浏览器与服务器之间的一次连接,我们就称为一次会话

②、会话跟踪方案对比
-  Cookie
| 方案一:Cookie(传统方案) 
 | 
| 示例代码: 
 | 
| 测试结果:(c1) 
 测试结果:(c2) 
 | 
-  Session
| 方案二:Session (传统方案) 
 | 
| 示例代码: 
 | 
| 测试结果:(s1) 
 测试结果:(s2) 
 | 
-  令牌技术(主流方案)
| 方案三:令牌技术(主流方案) 
 | 
3、JWT令牌
①、简介

数字签名部分是根据前面的签名算法计算得来的,而不是Base64编码
②、应用场景

③、JWT - 生成

单元测试:
| Ⅰ、引入JWT令牌依赖: | 
| 
 | 
| Ⅱ、测试方法(生成JWT): | 
| 
 签名算法分类: 
 | 
④、JWT - 校验

示例:
| Ⅲ、测试方法(解析JWT令牌): | 
| 
 解析结果: 
 如果生成的令牌被篡改了,程序将会直接报错: 
 | 
⑤、登录后下发令牌(用户成功登录的标记)


实现思路:

操作步骤:
| Ⅰ、进入JWT工具类(JwtUtils.java): | 
| 
 | 
| Ⅱ、修改Controller业务方法: | 
| 
 | 
| Ⅲ、单元测试: | 
| 
 令牌解析: 
 | 
4、过滤器Filter


①、快速入门

示例:
| Ⅰ、定义Filter:定义一个类,实现Filter接口,并重写其所有方法; | 
| Ⅱ、配置Filter:Filter类上加 @WebFilter注解,配置拦截资源的路径,引导类上加@ServletComponentScan开启Servlet组件支持: | 
| 
 在引导类上加注解: 
 | 
| Ⅲ、在doFilter方法中放行请求: | 
| 
 | 
小结:(由于Filter是Java Web的三大组件,而不是Spring的组件,所以,我们要想在Spring中使用Filter这个组件,要额外添加一个注解@ServletComponentScan)


②、详解(执行流程、拦截路径、过滤器链)
Filter执行流程:

| 示例: | 
| 
 | 
| 问题: | 
| 
 | 
Filter拦截路径:

| 示例:(只拦截login路径) | 
| 
 | 
过滤器链:

| 示例:(新增Filter1:AbcFilter) | 
| 
 | 
| Postman发送请求: | 
| 
 | 
小结:

③、实现登录校验 - Filter

| 思考: 
 | 
| 流程: 
 | 
| 代码实现: | 
| Ⅰ、过滤器(LoginCheckFilter.java): | 
| 
 
 
 | 
| Ⅱ、测试: | 
| 登录请求:(直接放行) 
 查询部门请求:(携带token): 
 | 
5、拦截器(Interceptor)

①、简介 & 快速入门

快速入门:

示例:
| Ⅰ、定义拦截器(LoginCheckInterceptor.java),实现HandlerInterceptor接口,并重写其所有方法: | 
| 
 | 
| Ⅱ、注册拦截器(WebConfig.java 配置类): | 
| 
 | 
②、详解(拦截路径、执行流程)
拦截路径:(/*:一级路径,/**:任意级路径)

执行流程:

Filter 与 Interceptor 的区别:

③、实现登录校验 - Interceptor

主要是放行的形式不同,其它逻辑 Filter 和 Interceptor 都是一样的,两者我们选择一个使用就可以

三、异常处理
1、出现异常的不符合规范数据

①、示例
| 示例:(重复添加部门名称) dept.name 存在唯一约束: 
 返回的JSON数据:(不符合开发规范) 
 | 
②、思考

解决方案:(全局异常处理器)

③、全局异常处理器

示例:
| Ⅰ、创建全局异常处理器(GlobalExceptionHandler.java): | 
| 
 | 
| Ⅱ、测试:(重复添加部门) | 
| 
 全局异常处理器捕获: 
 前端解析: 
 | 
④、小结







































































