spring - Spring 5 WebFlux中的拦截器

标签 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);

}
...
...

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

提前致谢。

最佳答案

Spring WebFlux中没有HandlerInterceptor的概念,但是您可以使用自己的WebFilter代替。

您所描述的功能听起来很像执行器和千分尺提供的指标支持。如果您想尝试一下:

  • 将执行器依赖项添加到项目
  • 公开the relevant endpoints(此处为metrics)
  • 转到"/actuator/metrics并选择服务器HTTP请求的度量标准(请参阅the reference documentation)。

  • 千分尺提供了更多方法,并可以帮助您正确设置指标,例如:在测量时间时考虑GC暂停,提供直方图/百分位数/...等。

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

    关于spring - Spring 5 WebFlux中的拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47091717/

    相关文章:

    java - Spring 启动+ hibernate

    java - C3PO 连接池 - 连接未释放

    java - 如何将嵌套列表元素传递给 spring mvc 中的 Controller

    java - 在 Tomcat 中为 Spring MVC REST API 禁用默认错误页面

    spring - 使用cron在Spring中安排周期性的 react 任务?

    spring - JPQL 多对多 - in 子句

    java - 使用 Spring Jdbc 模板面对嵌套 beans 查询

    java - Spring Data JPA 中的自定义(原始)查询

    spring-webflux - 因为我的基本URI不固定,所以在Webflux中一次又一次地创建Webclient是否明智?

    spring - HATEOAS 关于 Spring Flux/Mono 响应