JavaWeb —— 登录校验
本文介绍了JWT令牌和会话技术在Web开发中的应用。主要内容包括:1)JWT令牌的生成与校验,对比了setSubject与setClaims的区别;2)登录流程中JWT令牌的下发与校验机制;3)过滤器(Filter)的基本概念、执行流程及登录校验的实现;4)比较了Filter、Interceptor和API网关的适用场景。文章通过代码示例和图示详细说明了JWT令牌的集成使用方式,以及如何通过过滤器
·
概述


会话技术
会话技术

Cookie



JWT令牌
JWT简介

JWT应用场景

JWT依赖
<!-- JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
JWT生成

JWT校验

思:
setSubject 和 setClaims 的区别
1. setSubject
- 作用:设置 JWT 的主题(Subject),通常用于存储用户标识(如用户ID、用户名等)。
- 位置:在 JWT 的
payload中,subject是一个预定义的字段,通常用于存储与 JWT 相关的主要实体(如用户)的标识。 - 示例:
适用场景:当你只需要存储一个简单的用户标识时,使用 setSubject 是一个方便的选择。.setSubject(id) // 将用户ID放进JWT
2. setClaims
- 作用:设置 JWT 的自定义声明(Claims),可以存储任意的键值对。
- 位置:在 JWT 的
payload中,claims是一个自定义的字段,可以存储多个键值对,用于存储更多的用户信息或业务数据。 - 示例:
适用场景:当你需要存储多个自定义字段时,使用 setClaims 可以更灵活地存储各种信息。Map<String, Object> claims = new HashMap<>(); claims.put("id", id); claims.put("name", "tom"); .setClaims(claims) // 自定义内容(载荷)
3. 示例代码
/**
* 生成JWT
*
* @param id 手机号
* @return JWT
*/
public static String generate(String id) {
/**
* 过期时间目前设置成2天,这个配置随业务需求而定
*/
private final static Duration expiration = Duration.ofHours(TimeOutEnum.JWT_TIME_OUT.getTimeOut());
// 过期时间
Date expiryDate = new Date(System.currentTimeMillis() + expiration.toMillis());
Map<String, Object> claims = new HashMap<>();
claims.put("id", id);
claims.put("name", "tom");
return Jwts.builder()
.signWith(SignatureAlgorithm.HS512, ConfigEnum.TOKEN_SECRET_KEY.getValue()) // 设置加密算法和秘钥
// .setClaims(claims) //自定义内容(载荷)
.setExpiration(expiryDate) // 设置过期时间
.setSubject(id) // 将id放进JWT
.setIssuedAt(new Date()) // 设置JWT签发时间
.compact();//将构建好的 JWT 序列化为一个紧凑的字符串。
}
4.总结
setSubject:用于存储单个用户标识,如用户ID或用户名。setClaims:用于存储多个自定义字段,可以存储更多的用户信息或业务数据。- 最佳实践:通常情况下,
setSubject用于存储用户的主要标识,而setClaims用于存储其他自定义信息。
登录后下发令牌


在登录后的后续请求中,如何校验JWT令牌?

思:Filter、Interceptor 和 API 网关的比较?
1. Filter(过滤器)
- 定义:基于 Servlet 规范实现,依赖于 Servlet 容器(如 Tomcat)。
- 特点:
- 可以处理几乎所有的请求,包括静态资源和动态资源。
- 基于回调机制,通过
doFilter方法实现。 - 可以修改请求和响应对象[。
- 适用场景:
- 统一字符编码。
- 跨域处理(CORS)。
- 安全过滤(如 XSS、SQL 注入)。
- Gzip 压缩。
- 非 Spring 环境下的通用处理。
2. Interceptor(拦截器)
- 定义:基于 Spring MVC 框架实现,依赖于 Spring 容器。
- 特点:
- 只能处理由 Spring MVC 管理的请求(如 Controller)。
- 基于 Java 反射机制,通过实现
HandlerInterceptor接口。 - 可以访问请求的控制器和方法,但不能修改请求和响应对象。
- 提供更细粒度的控制,如方法前后、异常抛出前后。
- 适用场景:
- 登录状态校验。
- 权限控制。
- 性能监控。
- 操作日志记录。
- 模型数据增强。
3. API 网关
- 定义:位于客户端和后端服务之间,作为中间层来处理所有客户端请求。
- 特点:
- 可以实现请求路由、负载均衡、权限控制、安全策略等功能。
- 通常使用 Zuul、Spring Cloud Gateway 等框架实现。
- 可以集中管理跨多个服务的通用逻辑。
- 适用场景:
- 微服务架构中的统一入口。
- 集中处理跨服务的认证、鉴权。
- 请求路由和负载均衡。
- 安全策略管理。
选择建议
- Filter:适用于通用的请求处理逻辑,如字符编码、安全过滤、跨域处理等。这些逻辑通常与业务无关,需要在请求进入应用的早期阶段处理。
- Interceptor:适用于与业务逻辑相关的处理,如登录校验、权限控制、性能监控等。这些逻辑通常需要访问请求的控制器和方法。
- API 网关:适用于微服务架构,需要集中管理跨多个服务的通用逻辑,如认证、鉴权、路由等。
总结
- Filter:通用处理,如字符编码、安全过滤。
- Interceptor:业务相关的预处理,如登录校验、权限控制。
- API 网关:微服务架构中的统一入口,集中管理跨服务的通用逻辑。
过滤器Filter
概述

快速入门


Filter执行流程

Filter拦截路径

过滤器链

小结

登录校验过滤器

拦截器Inceptor

简介 & 快速入门


详解
拦截路径

执行流程

登录校验 - Interceptor

更多推荐

所有评论(0)