登陆校验 - 过滤器 - 拦截器 - 全局异常

71 阅读3分钟

登陆校验 - 过滤器 - 拦截器 - 全局异常

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 工作流程
  1. 用户向身份验证服务提供有效的凭据
  2. 身份验证服务验证凭据并生成JWT
  3. 身份验证服务将生成的JWT返回给用户
  4. 用户在后续请求中将JWT放置在请求头、请求参数或Cookie中进行传递
  5. 服务器接收到请求后从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(指定异常)