目录
一、登录功能
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): |
Ⅱ、测试:(重复添加部门) |
全局异常处理器捕获: 前端解析: |