Spring 5 WebFlux中的拦截器

Dee*_*mar 5 spring spring-mvc spring-webflux

Spring WebFlux在我的项目中使用。我想创建一个拦截器来计算每个API花费的时间。在Spring MVC我们所HandlerInterceptor没有的spring-boot-starter-webflux。我尝试添加spring-boot-starter-web并编写了拦截器,但没有成功。这是代码:

@Component
public class TimeInterceptor implements HandlerInterceptor {

public static Logger logger = Logger.getLogger(TimeInterceptor.class);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    long startTime = System.currentTimeMillis();
    request.setAttribute("startTime", startTime);
    return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    long totaltime = System.currentTimeMillis() - (long) request.getAttribute("startTime");
    request.setAttribute("totaltime", totaltime);
    logger.info("Logging total time" + totaltime);

}
...
...
Run Code Online (Sandbox Code Playgroud)

我想向我的应用程序添加类似的功能,并拦截每次调用所花费的时间。

提前致谢。

Bri*_*zel 7

HandlerInterceptorSpring WebFlux 中没有 的概念,但您可以使用自己的概念WebFilter

您描述的功能听起来很像 Actuator 和 Micrometer 提供的指标支持。如果您想尝试一下:

  1. 将执行器依赖项添加到您的项目中
  2. 公开相关端点(此处,metrics
  3. 转至"/actuator/metrics服务器 HTTP 请求并选择指标(请参阅参考文档)。

Micrometer 提供了更多功能,可帮助您获得正确的指标,例如:在测量时间时考虑 GC 暂停、提供直方图/百分位数/...等等。

注意:添加spring-boot-starter-web到您的应用程序会将其变成 Spring MVC 应用程序。


V. *_*sov 6

如果要在请求开始和完成时处理请求,可以使用WebFilter

尝试这样的事情

@Component
public class CustomWebFilter implements WebFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        long startTime = System.currentTimeMillis();
        return chain.filter(exchange).doFinally(signalType -> {
            long totalTime = System.currentTimeMillis() - startTime;
            exchange.getAttributes().put("totalTime", totalTime);
            System.out.println(totalTime);
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

当请求处理开始时,所有定义的过滤器都会被调用。Mono 从过滤器返回。它指示请求处理何时完成。