webflux切面拦截权限,webflux整合aop,webflux获取request
背景
在springboot+tomcat应用中获取request对象可以使用RequestContextHolder.getRequestAttributes()的方式来获取,此种方式的核心在于request所在容器被放在threadlocal中,但是webflux结合netty项目却不能这么使用,因为webflux是异步响应式的,下面介绍下异步服务webflux+netty如何便捷获取request。
编写基于webflux的RequestContextHolder实现
- 编写ReactiveHttpContextHolder类用来模拟RequestContextHolder
public class ReactiveHttpContextHolder {//获取当前请求对象public static Mono<ServerHttpRequest> getRequest() {return Mono.subscriberContext().map(context -> context.get(Info.CONTEXT_KEY).getRequest());}//获取当前responsepublic static Mono<ServerHttpResponse> getResponse(){return Mono.subscriberContext().map(context -> context.get(Info.CONTEXT_KEY).getResponse());}public static final class Info{public static final Class<ServerWebExchange> CONTEXT_KEY = ServerWebExchange.class;}
}
- 编写过滤器类用于设置request到容器中
@Component
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class AppFilter implements WebFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {//设置当前请求return chain.filter(exchange).subscriberContext(context -> context.put(ReactiveHttpContextHolder.Info.CONTEXT_KEY, exchange));}
}
编写切面实现token拦截,校验权限
- 切面逻辑代码
@Component
@Aspect
public class AuthAspect extends BaseController {@Pointcut("execution(public * xx.xx.xxController.*(..))")private void classRule(){}//带有AuthIgnore注解的不校验@Pointcut("@annotation(xx.AuthIgnore)")private void ignoreRule(){}@Around("classRule() && !ignoreRule()")public Mono<Object> aroundInvoke(ProceedingJoinPoint joinPoint){//获取tokenMono<ServerHttpRequest> requestMono = ReactiveHttpContextHolder.getRequest();return requestMono.flatMap(request -> {//检查tokenString token = getHeader("token", request);if (token == null || TokenCacheContainer.getTokenCache().get(token) == null){BusException ex = new BusException("01300001");return buildErrMsg(ex);} else {try {return (Mono<Object>) joinPoint.proceed();} catch (Throwable throwable) {LogFactory.getLog(AuthAspect.class).error("", throwable);BusException ex = new BusException("01300000");return buildErrMsg(ex);}}});}private Mono<String> buildErrMsg(BusException ex){ApiJsonResult errResult = ApiJsonResult.createErrResult(ex.getErrorCode(), ex.getReason(), ex.getResolve());return Mono.just( errResult.toString() );}
}
- 说明
过滤器会在切面之前执行,因此aop中能获取到在filter中设置的request - 测试结果
webflux切面拦截权限,webflux整合aop,webflux获取request相关推荐
- java切面获取reqiest,怎么在webflux切面中获取请求头.
问题描述. 萌新在线踩坑.... 我需要在切面中获取当前用户的请求信息,比如请求头信息. 但是不能像mvc一样通过以下方式实现. @Autowired private HttpServletReque ...
- java切面类整合_SpringBoot2.x【五】整合AOP切面编程
SpringBoot2.x[五]整合AOP切面编程 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. ...
- 动态代理——拦截器——责任链——AOP面向切面编程底层原理详解(迪丽热巴版)
目录 动态代理模式详解 前言 什么是代理模式 如何进行代理 静态代理 动态代理 JDK动态代理 CGLIB动态代理 拦截器 责任链模式 博客文章版权申明 动态代理模式详解 前言 代理模式是设计模式中非 ...
- 日志管理(spring AOP切面拦截)
**最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...
- No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)
代码地址与接口看总目录:[学习笔记]记录冷冷-pig项目的学习过程,大概包括Authorization Server.springcloud.Mybatis Plus~~~_清晨敲代码的博客-CSDN ...
- 【SpringBoot】SpingBoot整合AOP
说起spring,我们知道其最核心的两个功能就是AOP(面向切面)和IOC(控制反转),这边文章来总结一下SpringBoot如何整合使用AOP. 一.示例应用场景:对所有的web请求做切面来记录日志 ...
- 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
转载自 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...
- 【Spring Boot】整合 AOP
认识AOP 1.1 什么是AOP 1.2 AOP中的概念 SpringBoot整合AOP代码示例 2.1 使用execution(路径表达式) 2.2 使用annotation(注解) JoinPoi ...
- SpringBoot-Security 具体案例、 实现安全框架、权限控制、aop切入
SpringBoot-Security 具体案例. 实现安全框架.权限控制.aop切入 SpringBoot-Security介绍 Security 官方序言 安全是一个不断变化的目标,追求一个全 ...
最新文章
- Tree-Structured LSTM模型
- 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践...
- dom4j生成、解析xml
- MySql随笔part3 表操作
- React开发(135):ant design学习指南之form中动态form新增删除
- 火爆的大数据被什么拖了后腿
- qt如何编写android程序,如何利用Qt开发Android应用程序
- html在线预览wordexcel文档,直接在线预览Word、Excel、TXT文件之ASP.NET
- SDK二次开发摄像头语音转发功能和语音对讲
- ubuntu安装frps服务器与xtcp配置
- Mybatis关联查询的两种方式
- 分享 40 个免费的前端初学者视频教程
- 小姐姐教你用代码画画,真大佬!
- 软件测试人员能力矩阵
- 【Linux】进程状态
- UDP的主要特点、首部格式及功能
- mysql学习第二天
- echarts画市县乡镇级地图
- 折半查找--hnust oj
- wps表格l制作甘特图_甘特图是什么?-如何用WPS表格做甘特图
热门文章
- python tips(持续更新)
- OO Design之SOLID原则
- java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举
- Springboot 请求数据
- web.xml中如何配置Servlet文件
- ajax文件上传报400,js ajaxfileupload.js上传报错的解决方法
- oracle查询记录插入,我应该使用哪种查询语法在Oracle数据库中插入记录?
- linux ftp非隔离模式,FTP实验报告非隔离用户的使用教案.doc
- python的语言是什么歌_用python对歌词进行语言分析
- 计算机专业的校本教材,[中职计算机专业校本教材建设思路与实践]中职计算机专业课程...