【问题标题】:Using Webflux, is it possible to use AOP to get ServerHttpRequest for logging使用 Webflux,是否可以使用 AOP 获取 ServerHttpRequest 进行日志记录
【发布时间】:2021-04-13 03:48:10
【问题描述】:

以前我的网关系统是使用 spring boot spring-boot-starter-web && rest template (阻塞) 创建的。

现在我想更改为使用 Webflux,因为响应式似乎更适合我的情况。 Performance Reference

以前我使用 AOP 来记录 HttpServletRequestFilter && HttpServletRequestWrapper。例如:

RequestAttributes ra = RequestContextHolder.getRequestAttributes();
ServerHttpRequest servletRequest = ((ServletRequestAttributes) ra).getRequest();
String xForwardedFor = servletRequest.getHeader("X-FORWARDED-FOR");
String remoteAddress = StringUtils.isBlank(xForwardedFor) ? servletRequest.getRemoteAddr() : xForwardedFor;

我的问题是:是否可以使用 AOP 获取 ServerHttpRequest 进行日志记录?

我已阅读 this article 并且我认为这对我的情况来说还不够,例如记录客户端地址。

非常感谢 && 如果需要更多信息,请告诉我。 ????

【问题讨论】:

  • 你好@vincent-tang 我也面临同样的问题。你有遇到什么解决办法吗?
  • @Merch0 很遗憾,不,我找不到任何仅使用 Webflux 的解决方案。我现在决定同时使用spring-boot-starter-web && spring-boot-starter-webflux。在 AOP 中,同样的方法获取 servlet 请求,ProceedingJoinPoint 继续后,订阅 if value instanceof Flux or Mono。这应该工作????。

标签: java spring spring-boot spring-webflux spring-aop


【解决方案1】:

是的,这是可能的。
ServerHttpRequest 可用于获取客户端地址,然后您就可以登录它。 我没有使用 AOP 的示例,但这是记录 IP 的方式:

@GetMapping()
public Mono<Employee> receiveMono(ServerHttpRequest request) {
    log.info(request.getRemoteAddress().toString());
    ...

如果可以定期获取客户端地址,也可以通过AOP获取。

在我的德语博客中,我写了一些关于 Spring 响应式的文章:
https://agile-coding.blogspot.com/2021/02/webflux.html

【讨论】:

  • 使用 AOP 的主要原因之一是因为我的情况不可能在每个传入的 HTTP 请求方法中添加 ServerHttpRequest request。抱歉,我的问题似乎让人们误解了。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多