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

问题描述.

萌新在线踩坑....

我需要在切面中获取当前用户的请求信息,比如请求头信息.

但是不能像mvc一样通过以下方式实现.

@Autowired

private HttpServletRequest request;

ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();

// 获取 request

HttpServletRequest request = requestAttributes.getRequest();

问题出现的环境背景及自己尝试过哪些方法

我尝试过自己创建一个ReactiveRequestContextHolder来获取

https://segmentfault.com/a/1190000018766412

但是返回是null.

之后

相关代码

我参考了以上的文章的代码.

以下是我的代码(我可能哪里理解错误了).

// 拦截器

// 把request对象放入Mono上下文中,key为一个class对象

@Configuration

@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)

public class ReactiveRequestContextFilter implements WebFilter {

@Override

public Mono filter(ServerWebExchange exchange, WebFilterChain chain) {

ServerHttpRequest request = exchange.getRequest();

return chain.filter(exchange)

.subscriberContext(ctx -> ctx.put(ReactiveRequestContextHolder.CONTEXT_KEY, request));

}

}

// 上下文

// 从Mono中获取上下文,key为一个class对象

public class ReactiveRequestContextHolder {

public static final Class CONTEXT_KEY = ServerHttpRequest.class;

public static Mono getRequest() {

return Mono.subscriberContext()

// TODO 报错了 reactor.core.Exceptions$ErrorCallbackNotImplemented: java.util.NoSuchElementException: Context is empty

.map(ctx -> ctx.get(CONTEXT_KEY));

}

}

// TODO 未完成 切面bean

// 过滤含有@test注解的控制层方法,取出名为testHeader的请求头信息并打印.

@Slf4j

@Aspect

@Component

@AllArgsConstructor

public class SecurityInnerAspect {

// test 的内容被调用后进入切面

@Around("@annotation(test)")

// 不用JoinPoint 用 ProceedingJoinPoint,因为ProceedingJoinPoint可以拦截请求

public Object around(ProceedingJoinPoint point, Inner inner) throws Throwable {

ReactiveRequestContextHolder.getRequest().subscribe(serverHttpRequest -> {

String header = Objects.requireNonNull(serverHttpRequest.getHeaders().get("testHeaderStr")).get(0);

log.info("print testHeader: {}", header);

});

return point.proceed();

}

}

期待的结果

我期待能在切面中取出用户request对象进行操作.

或能有其他解决方案.

感谢!!

实际看到的错误信息

本以为会通过spring的依赖反转拿到request对象,但是他没有和mvc一样的把当前用户的request对象注册成bean.也没有放到当前线程中.

且其他方式不太会用.

so,目前没有办法在切面bean中取出request信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值