java切面获取reqiest,怎么在webflux切面中获取请求头.
問題描述.
萌新在線踩坑....
我需要在切面中獲取當(dāng)前用戶的請求信息,比如請求頭信息.
但是不能像mvc一樣通過以下方式實(shí)現(xiàn).
@Autowired
private HttpServletRequest request;
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// 獲取 request
HttpServletRequest request = requestAttributes.getRequest();
問題出現(xiàn)的環(huán)境背景及自己嘗試過哪些方法
我嘗試過自己創(chuàng)建一個ReactiveRequestContextHolder來獲取
https://segmentfault.com/a/1190000018766412
但是返回是null.
之后
相關(guān)代碼
我參考了以上的文章的代碼.
以下是我的代碼(我可能哪里理解錯誤了).
// 攔截器
// 把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 的內(nèi)容被調(diào)用后進(jìn)入切面
@Around("@annotation(test)")
// 不用JoinPoint 用 ProceedingJoinPoint,因?yàn)镻roceedingJoinPoint可以攔截請求
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();
}
}
期待的結(jié)果
我期待能在切面中取出用戶request對象進(jìn)行操作.
或能有其他解決方案.
感謝!!
實(shí)際看到的錯誤信息
本以為會通過spring的依賴反轉(zhuǎn)拿到request對象,但是他沒有和mvc一樣的把當(dāng)前用戶的request對象注冊成bean.也沒有放到當(dāng)前線程中.
且其他方式不太會用.
so,目前沒有辦法在切面bean中取出request信息
總結(jié)
以上是生活随笔為你收集整理的java切面获取reqiest,怎么在webflux切面中获取请求头.的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 结果集 json,在PHP中提取
- 下一篇: 复调制细化分析matlab,基于复调制的