概述

在这里插入图片描述
在这里插入图片描述

会话技术

会话技术

在这里插入图片描述

Cookie

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

JWT令牌

JWT简介

在这里插入图片描述

JWT应用场景

在这里插入图片描述

JWT依赖

        <!--        JWT-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

JWT生成

在这里插入图片描述

JWT校验

在这里插入图片描述

思:

setSubjectsetClaims 的区别

1. setSubject
  • 作用:设置 JWT 的主题(Subject),通常用于存储用户标识(如用户ID、用户名等)。
  • 位置:在 JWT 的 payload 中,subject 是一个预定义的字段,通常用于存储与 JWT 相关的主要实体(如用户)的标识。
  • 示例
    .setSubject(id) // 将用户ID放进JWT
    
    适用场景:当你只需要存储一个简单的用户标识时,使用 setSubject 是一个方便的选择。
2. setClaims
  • 作用:设置 JWT 的自定义声明(Claims),可以存储任意的键值对。
  • 位置:在 JWT 的 payload 中,claims 是一个自定义的字段,可以存储多个键值对,用于存储更多的用户信息或业务数据。
  • 示例
    Map<String, Object> claims = new HashMap<>();
    claims.put("id", id);
    claims.put("name", "tom");
    .setClaims(claims) // 自定义内容(载荷)
    
    适用场景:当你需要存储多个自定义字段时,使用 setClaims 可以更灵活地存储各种信息。
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

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐