【问题标题】:intercept request start and end in Vaadin 14 (Flow) with Spring Boot使用 Spring Boot 在 Vaadin 14 (Flow) 中拦截请求开始和结束
【发布时间】:2023-03-25 06:30:02
【问题描述】:

我正在使用 vaadin-spring-boot-starter 来集成 Vaadin Framework 14 和 Spring Boot。

我想重写SpringServlet 类的requestStartrequestEnd 方法来做以下事情:

  • 将当前路由/视图路径和当前用户 ID 等内容放入 SLF4J MDC,以便将其包含在每个日志记录语句中
  • 记录请求的持续时间

在 Vaadin 8 中有一个 SpringVaadinServlet 类,我可以通过简单地用 @SpringComponent("vaadinServlet") 注释我的自定义子类来替换它。

这种方法不再有效。 vaadin-spring 集成包含 SpringBootConfiguration,其中包含对 SpringServlet 构造函数的直接调用:

@Bean
public ServletRegistrationBean<SpringServlet> servletRegistrationBean() {
    String mapping = configurationProperties.getUrlMapping();
    Map<String, String> initParameters = new HashMap<>();
    boolean rootMapping = RootMappedCondition.isRootMapping(mapping);
    if (rootMapping) {
        mapping = VaadinServletConfiguration.VAADIN_SERVLET_MAPPING;
        initParameters.put(Constants.SERVLET_PARAMETER_PUSH_URL,
                VaadinMVCWebAppInitializer
                        .makeContextRelative(mapping.replace("*", "")));
    }
    ServletRegistrationBean<SpringServlet> registration = new ServletRegistrationBean<>(
            new SpringServlet(context, rootMapping), mapping); // <-- HERE
    registration.setInitParameters(initParameters);
    registration.setAsyncSupported(configurationProperties.isAsyncSupported());
    registration.setName(
            ClassUtils.getShortNameAsProperty(SpringServlet.class));
    return registration;
}

他们应该在这里使用条件 bean,以便我们可以替换它,但不幸的是他们没有。

仅添加带有上述代码副本的自定义ServletRegistrationBean(但构造函数调用替换为我自己的)不起作用,即使使用@Primary

那么有没有比排除整个 vaadin-spring 自动配置并复制我自己的配置 bean 中的所有内容更好的方法来做我想做的事?它可以工作,但我必须在每次 vaadin-spring 升级后检查一切是否仍然正常。

【问题讨论】:

    标签: spring-boot vaadin vaadin-flow


    【解决方案1】:

    您可以添加VaadinServiceInitListener,通过它您可以添加自定义请求处理程序。或者,您可以使用Filter

    【讨论】:

    • 在这种情况下,添加请求处理程序是没有用的,因为 1) 我需要确保我的处理程序首先出现,然后才能开始常规请求处理,并且 2) 我需要挂钩到请求也是如此,所以在所有处理程序都执行之后。
    • A Filter 可能会起作用,但我不确定我是否可以访问当前的 UI(或 UI 范围的 bean),我需要获取一些我需要的信息记录。另外,我不想处理对静态资源等的请求,只是真正的 Vaadin UI 请求。
    • 仍然可以扩展 VaadinServlet 并覆盖服务方法。如果你不知道该怎么做,那就是让事情变糟的秘诀。但是,是的,这就是路径。我仍然倾向于认为在正常的应用程序中不应该有这样做的正当理由。
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 2019-01-14
    • 2011-07-13
    • 2020-11-19
    • 2021-05-06
    • 1970-01-01
    • 2018-08-09
    • 2021-05-27
    相关资源
    最近更新 更多