【Java Web】012 -- SpringBootWeb综合案例(登录功能、登录校验、异常处理)


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























































