Vaadin添加全局请求过滤器跳转自定义页面时UI.getCurrent()为空如何解决
问题原因
UI.getCurrent() 返回null的核心原因是RequestHandler处理的请求并不总是绑定到已创建的UI实例,应用初始加载请求、静态资源请求、服务端心跳请求等场景都不存在活跃UI上下文,因此无法获取到UI对象。
解决方案
方案1:RequestHandler中直接HTTP重定向(覆盖所有请求场景)
该方案不需要依赖UI实例,适合需要拦截所有类型请求的需求,操作更稳妥。
- 先给自定义视图指定固定路由:
@Route("lock-page") public class MyCustomView extends VerticalLayout { // 你的自定义页面实现逻辑 }
- 修改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
相关产品推荐
相关产品推荐

