日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/17 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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信息

總結

以上是生活随笔為你收集整理的java切面获取reqiest,怎么在webflux切面中获取请求头.的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。