springboot~拦截器的使用场景
在用户登陆之后,我们一般会把用户登陆的状态和相关信息进行存储,把对应的token返回到客户端进行存储,下次请求过来时,系统可以通过token拿到当前这个用户的相关信息,这是授权通常的作法,而有时一些业务里,你存储的用户信息不是全局的,可能只是某几个接口会用户某些信息,而你把它存储起来就不是很合理;并且一些隐私信息持久化到redis也不合理,这时就需要统一对这种接口的请求做一起处理了。
拦截器HandlerInterceptor
我们可以去实现这个HandlerInterceptor接口,它会把请求页面前,请求页面后等方法,我们可以重写它们,把自己的逻辑加进来,比如我们可以在请求页面前,通过当前登陆人ID获取到当前登陆人能看的信息ID集合,并把这些ID集合以参数的形式传到这个页面里,这个过程是在服务端自动完成的,即对某个页面(接口)进行拦截,添加自己的逻辑。
/**
* 当前用户的数据权限.
*/
@Slf4j
public class DataPermissionInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("DataPermissionInterceptor.init");
//业务逻辑,可能判断当前登陆人存储的数据权限类型,然后统一处理,拿到可以访问的数据编号集合
String[] ids = {"1", "2", "3"};
request.setAttribute("approveIds", StringUtils.join(ids, ","));
return true;
}
}
注册这个拦截器
/**
* 注册拦截器
*/
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(new DataPermissionInterceptor()).addPathPatterns("/approve/**");
}
}
在对应的页面(接口)里读取在拦截器里赋值的对象,就可以进行剩下的工作了。
通过这个例子我们了解到,对一些具有统一操作的动作,我们可以把它提取到拦截器里去完成。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2019-05-28 spring单元测试下模拟rabbitmq
2015-05-28 MongoDB学习笔记~以匿名对象做为查询参数,方便查询子对象
2015-05-28 Moebius实现Sqlserver集群~介绍篇
2015-05-28 知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题
2012-05-28 架构,改善程序复用性的设计~第三讲 实现一种功能的代码只能出现在一处
2012-05-28 架构,改善程序复用性的设计~(第一和第二讲目录)