• Sa-Token v.1.31.0 新增拦截器 SaInterceptor 功能说明,以及旧代码迁移示例


    前言

    如果你的项目没有使用旧写法,可以忽略本篇文章 移步官网,本文只针对旧版本到新版本的迁移提供示例。

    1、旧版本

    Sa-Token 在 1.30.0 及以下版本中使用两个拦截器:

    • SaAnnotationInterceptor:负责提供注解鉴权能力。
    • SaRouteInterceptor:负责提供路由拦截鉴权能力。

    这次新增的拦截器 SaInterceptor 名字为综合拦截器,见名思意就是综合上述两个拦截器的能力,既提供注解鉴权能力,也提供路由鉴权能力,目的是为了替代上述两个拦截器(v1.31.0已将上述两个类打上 @Deprecated 标记)。

    2、新版本用法

    在用法上 SaInterceptor 可以简单总结为两点:

    1. 相对于 SaAnnotationInterceptor,只做增强,不做改变,可以直接无损替换。
    2. 相对于 SaRouteInterceptor,除掉其默认的 StpUtil.checkLogin() 登录校验能力,默认不执行任何动作。

    下面将用几个示例详细展示 SaInterceptor 带来的变化点。

    3、示例

    示例1,注解鉴权

    原写法:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 注册 Sa-Token 注解拦截器,打开注解鉴权功能 
    	registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    新版本写法:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 注册 Sa-Token 拦截器,打开注解鉴权功能 
    	registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    总结:只替换一下拦截器的名称就可以了。

    示例2,路由鉴权,默认登录校验

    原写法:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 注册 Sa-Token 的路由拦截器
    	registry.addInterceptor(new SaRouteInterceptor())
    		.addPathPatterns("/**")
    		.excludePathPatterns("/user/doLogin"); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    新版本写法:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 注册 Sa-Token 的路由拦截器
    	registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
    			.addPathPatterns("/**")
    			.excludePathPatterns("/user/doLogin"); 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    总结:由于默认的登录校验功能不提供了,所有需要我们手动补一下。

    示例3,路由鉴权,自定义认证规则

    原写法:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 注册 Sa-Token 拦截器,定义详细认证规则 
    	registry.addInterceptor(new SaRouteInterceptor((req, res, handler) -> {
    		// 根据路由划分模块,不同模块不同鉴权 
    		SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
    		SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
    		SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
    		SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
    		SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
    		SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
    		// ...
    	})).addPathPatterns("/**");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    新版本写法:

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// 注册 Sa-Token 拦截器,定义详细认证规则
    	registry.addInterceptor(new SaInterceptor(handler -> {
    		// 根据路由划分模块,不同模块不同鉴权 
    		SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
    		SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
    		SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
    		SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
    		SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
    		SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));
    		// ...
    	})).addPathPatterns("/**");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    总结:做一下名称 + 参数替换 就可以了。


    新版本拦截器大体上就带来这三种变化,另外还新增了一个注解 @SaIgnore 代表忽略掉指定方法的鉴权校验,快来官网文档查看一下吧。:)

  • 相关阅读:
    文盘Rust -- 生命周期问题引发的 static hashmap 锁
    中国科学院大学计算机考研资料汇总
    unity 改变模型及其子物体的Shader和透明度
    windows上mysql安装
    放学辣[简单版]
    day12-Servlet02
    GUI 应用:socket 网络聊天室
    数据库的三大范式(重要)
    二叉树进阶
    [附源码]java毕业设计订单管理系统
  • 原文地址:https://blog.csdn.net/shengzhang_/article/details/126458949