背景

在springboot+tomcat应用中获取request对象可以使用RequestContextHolder.getRequestAttributes()的方式来获取,此种方式的核心在于request所在容器被放在threadlocal中,但是webflux结合netty项目却不能这么使用,因为webflux是异步响应式的,下面介绍下异步服务webflux+netty如何便捷获取request。

编写基于webflux的RequestContextHolder实现

  1. 编写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;}
}
  1. 编写过滤器类用于设置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拦截,校验权限

  1. 切面逻辑代码
@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() );}
}
  1. 说明
    过滤器会在切面之前执行,因此aop中能获取到在filter中设置的request
  2. 测试结果

webflux切面拦截权限,webflux整合aop,webflux获取request相关推荐

  1. java切面获取reqiest,怎么在webflux切面中获取请求头.

    问题描述. 萌新在线踩坑.... 我需要在切面中获取当前用户的请求信息,比如请求头信息. 但是不能像mvc一样通过以下方式实现. @Autowired private HttpServletReque ...

  2. java切面类整合_SpringBoot2.x【五】整合AOP切面编程

    SpringBoot2.x[五]整合AOP切面编程 面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP). OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面. ...

  3. 动态代理——拦截器——责任链——AOP面向切面编程底层原理详解(迪丽热巴版)

    目录 动态代理模式详解 前言 什么是代理模式 如何进行代理 静态代理 动态代理 JDK动态代理 CGLIB动态代理 拦截器 责任链模式 博客文章版权申明 动态代理模式详解 前言 代理模式是设计模式中非 ...

  4. 日志管理(spring AOP切面拦截)

    **最近,在写日志管理的东西呢,用了几种方法试,还是拦截比较好用,直接截下来传入到数据库中存储. 写的时候,真是头疼啊. 哦~对了,忘了说了,不需要用到Dao层哦. 首先,来一个POJO实体类吧,我看 ...

  5. No6-6.从零搭建spring-cloud-alibaba微服务框架,添加用户鉴权逻辑,动态数据权限(使用AOP实现)等(六,no6-6)

    代码地址与接口看总目录:[学习笔记]记录冷冷-pig项目的学习过程,大概包括Authorization Server.springcloud.Mybatis Plus~~~_清晨敲代码的博客-CSDN ...

  6. 【SpringBoot】SpingBoot整合AOP

    说起spring,我们知道其最核心的两个功能就是AOP(面向切面)和IOC(控制反转),这边文章来总结一下SpringBoot如何整合使用AOP. 一.示例应用场景:对所有的web请求做切面来记录日志 ...

  7. 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析

    转载自  接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...

  8. 【Spring Boot】整合 AOP

    认识AOP 1.1 什么是AOP 1.2 AOP中的概念 SpringBoot整合AOP代码示例 2.1 使用execution(路径表达式) 2.2 使用annotation(注解) JoinPoi ...

  9. SpringBoot-Security 具体案例、 实现安全框架、权限控制、aop切入

    SpringBoot-Security 具体案例. 实现安全框架.权限控制.aop切入 SpringBoot-Security介绍 Security 官方序言 ​ 安全是一个不断变化的目标,追求一个全 ...

最新文章

  1. Tree-Structured LSTM模型
  2. 高并发应用场景下的负载均衡与故障转移实践,AgileEAS.NET SOA 负载均衡介绍与实践...
  3. dom4j生成、解析xml
  4. MySql随笔part3 表操作
  5. React开发(135):ant design学习指南之form中动态form新增删除
  6. 火爆的大数据被什么拖了后腿
  7. qt如何编写android程序,如何利用Qt开发Android应用程序
  8. html在线预览wordexcel文档,直接在线预览Word、Excel、TXT文件之ASP.NET
  9. SDK二次开发摄像头语音转发功能和语音对讲
  10. ubuntu安装frps服务器与xtcp配置
  11. Mybatis关联查询的两种方式
  12. 分享 40 个免费的前端初学者视频教程
  13. 小姐姐教你用代码画画,真大佬!
  14. 软件测试人员能力矩阵
  15. 【Linux】进程状态
  16. UDP的主要特点、首部格式及功能
  17. mysql学习第二天
  18. echarts画市县乡镇级地图
  19. 折半查找--hnust oj
  20. wps表格l制作甘特图_甘特图是什么?-如何用WPS表格做甘特图

热门文章

  1. python tips(持续更新)
  2. OO Design之SOLID原则
  3. java final类的写法_重拾JavaSE基础——抽象类、接口、代码块、final和枚举
  4. Springboot 请求数据
  5. web.xml中如何配置Servlet文件
  6. ajax文件上传报400,js ajaxfileupload.js上传报错的解决方法
  7. oracle查询记录插入,我应该使用哪种查询语法在Oracle数据库中插入记录?
  8. linux ftp非隔离模式,FTP实验报告非隔离用户的使用教案.doc
  9. python的语言是什么歌_用python对歌词进行语言分析
  10. 计算机专业的校本教材,[中职计算机专业校本教材建设思路与实践]中职计算机专业课程...