登陆校验 - 过滤器 - 拦截器 - 全局异常
1 会话跟踪技术
1.1 为什么需要会话跟踪
由于http协议是无状态,每次请求相互独立,没有办法共享数据, 导致例如在A处登陆, 在B处失效
1.2 实现会话跟踪技术
1.2.1 cookie
Cookie数据以键值对的形式存储在客户端,每次请求时会自动发送给服务器
优点: http支持
缺点: 移动端不能用, 不安全, 用户禁用Cookie就无法使用, 不支持跨域 (协议, 端口, ip任意一个不同的情况)
1.2.2 session
Session将数据存储在服务器的内存或数据库中,并通过唯一的session ID 在客户端和服务器之间进行关联。
优点: 数据安全, 支持跨域
缺点: cookie的缺点 (因为是cookie的另一种表达方式), 集群不能使用
1.2.3 JWT令牌
可以储存在任何地方
2 JWT 令牌
2.1 概念
JWT令牌是一种用户独有的身份标示符, 可以在两个实体之间安全地传输被声明的信息
令牌位于http连接的head:token中, 由三部分组成, 分别为头部(Header)、载荷(Payload)和签名(Signature)
2.1.1 头部
用Base64编码表示令牌类型, 签名算法等
2.1.2 载荷
包含要传递的声明或负载信息。可以包含一些标准的预定义字段(例如iss:发行人、exp:过期时间、sub:主题等)用Base64编码表示
2.1.3 签名
根据头部、载荷和秘钥生成的签名部分,用于验证消息的完整性和身份认证。
2.2 工作流程
- 用户向身份验证服务提供有效的凭据
- 身份验证服务验证凭据并生成JWT
- 身份验证服务将生成的JWT返回给用户
- 用户在后续请求中将JWT放置在请求头、请求参数或Cookie中进行传递
- 服务器接收到请求后从JWT中提取和验证信息,以确定用户的身份和权限
2.3 生成方法
2.3.1 导入依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
2.3.2 Jwts.builder()
/\ 算法和密匙
/\ 设置数据
/\ 设置时间
/\ 进行加密
2.4 校验方法
2.4.1 Jwts.parser()
/\ 指定密匙
/\ 解析的JWT字符串
2.4.2 校验失败
/\ JWT的字符串被篡改
/\ JWT令牌过期
3 统一拦截
统一拦截所有的请求
3.1 过滤器 Filter
3.1.1 定义
Filter 是基于 Servlet 规范的组件, 通过配置 web.xml 文件或使用注解的方式进行配置和使用, 主要用于请求的过滤和修改。例如,可以使用 Filter 进行身份验证、权限检查、字符编码转换等工作。
Filter 可以通过配置多个 Filter 组成一个 Filter 链,按照顺序依次对请求进行处理。
1. 先创接一个类实现Filter接口
2. 重写一个方法doFilter(), 并放行 filterchain.dofilter()
3. 在类上加上@WebFilter ( 指定拦截路径 )
/\ 全部拦截: /*
/\ 拦截特定请求: /请求地址
/\ 拦截某一部分请求: /depts/*
4. 在启动类上要加上@ServletComponentScan
3.2 拦截器 Interceptor
3.2.2 定义
Interceptor 是基于框架的组件, 由框架进行管理和调用的, 通过实现特定的拦截器接口或使用注解来定义, 主要用于拦截和处理框架内部的请求。例如,在 Spring MVC 中,拦截器可以用于日志记录、性能统计、事务管理等。
Interceptor 只能在框架内部进行配置和使用,通常是全局的或者特定控制器/方法级别的。
1. 创建一个类实现HandlerInterceptor, 并加上@Component注解
2. 重写其中的preHandler方法
3. 创建一个配置类, 实现WebMvcConfiguration ( 注册拦截 )
4. 重写其中一个 addInterceptors的方法
5. 在方法中关联拦截器
6. 全局异常处理
4.1 定义
可以用于对Controller抛出的异常做统一处理, 即, 未处理抛出error500, 处理后可以跳转/error page之类
4.2 实现方法
1. 创建一个类
2. 在类上加上一个注解 @RestControllerAdvice
3.在类中创建一个方法, 用于指定捕获的异常类型 @HandlerException(指定异常)