You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vaadin添加全局请求过滤器跳转自定义页面时UI.getCurrent()为空如何解决

问题原因

UI.getCurrent() 返回null的核心原因是RequestHandler处理的请求并不总是绑定到已创建的UI实例,应用初始加载请求、静态资源请求、服务端心跳请求等场景都不存在活跃UI上下文,因此无法获取到UI对象。

解决方案

方案1:RequestHandler中直接HTTP重定向(覆盖所有请求场景)

该方案不需要依赖UI实例,适合需要拦截所有类型请求的需求,操作更稳妥。

  1. 先给自定义视图指定固定路由:
@Route("lock-page")
public class MyCustomView extends VerticalLayout {
    // 你的自定义页面实现逻辑
}
  1. 修改RequestHandler逻辑,增加死循环规避判断:
public RequestHandler globalRequestHandler() {
    return (session, vaadinRequest, response) -> {
        if (isSessionlocked()) {
            // 避免重定向死循环:当前请求已经是锁定页面则直接放行
            String requestPath = vaadinRequest.getPathInfo();
            if (requestPath != null && requestPath.contains("lock-page")) {
                return false;
            }
            // 直接发起HTTP重定向到锁定页面
            response.sendRedirect("lock-page");
            // 返回true表示当前请求已处理完成,不需要后续链路处理
            return true;
        }
        return false;
    };
}

方案2:全局路由拦截(仅覆盖Vaadin路由请求,更符合原生规范)

如果只需要拦截Vaadin的路由跳转请求,不需要处理静态资源等非路由请求,推荐使用该方案,逻辑更简洁:

@Override
public void serviceInit(ServiceInitEvent serviceEvent) {
    // 注册UI初始化监听器,给每个新创建的UI绑定路由拦截规则
    serviceEvent.getSource().addUIInitListener(uiEvent -> {
        UI currentUi = uiEvent.getUI();
        currentUi.addBeforeEnterListener(beforeEnterEvent -> {
            // 会话已锁定,且当前目标不是锁定页面时,直接重路由到自定义页面
            if (isSessionlocked() && !beforeEnterEvent.getNavigationTarget().equals(MyCustomView.class)) {
                beforeEnterEvent.rerouteTo(MyCustomView.class);
            }
        });
    });
}

该方案下路由逻辑完全由Vaadin原生托管,不需要手动处理重定向路径,也不会出现死循环问题。


内容的提问来源于stack exchange,提问作者Aigeth Magendran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 23:36:03