为什么自定义实现的 VaadinServiceInitListener 不在 vaadin 13.0.2 中监听?

Rah*_*Jha 2 vaadin vaadin-flow

我想验证用户是否已登录以实现它,我在 vaadin 13.0.2 中找到了名为 VaadinServiceInitListener 的东西,此类用于侦听所有 UI 的 BeforeEnter 事件,以便在允许之前检查用户是否已登录进入任意页面。

我通过赞赏实现的登录功能和 VaadinServiceInitListener 创建了一个带有 app-layout-addon 的 vaadin 13.0.2 项目,以检查用户是否登录。

public class AAACATInitListener implements VaadinServiceInitListener {
    private static final long serialVersionUID = 1L;

    private static InAppSessionContextImpl appContextImpl;

    @Override
    public void serviceInit(ServiceInitEvent event) {
        System.out.println("in service init event");
        event.getSource().addUIInitListener(new UIInitListener() {
            private static final long serialVersionUID = 1L;

            @Override
            public void uiInit(UIInitEvent event) {

                event.getUI().addBeforeEnterListener(new BeforeEnterListener() {
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void beforeEnter(BeforeEnterEvent event) {

                        appContextImpl = (InAppSessionContextImpl)VaadinSession.getCurrent().getAttribute("context");

                        if (appContextImpl == null) {
                            WebBrowser webBrowser = UI.getCurrent().getSession().getBrowser();
                            String address = webBrowser.getAddress();

                            if(RememberAuthService.isAuthenticated(address) != null && !RememberAuthService.isAuthenticated(address).isEmpty()) {
                                //System.out.println("Found Remembered User....");
                                IBLSessionContext iblSessionContext = null;
                                try {
                                    iblSessionContext = new UserBLManager().doRememberedStaffUserLogin(RememberAuthService.isAuthenticated(address), "");
                                    if(iblSessionContext != null) {
                                        InAppSessionContextImpl localAppContextImpl = new InAppSessionContextImpl();
                                        localAppContextImpl.setBLSessionContext(iblSessionContext);
                                        localAppContextImpl.setModuleGroupList(iblSessionContext.getSessionAccessControl().getPermittedModuleGroups());
                                        appContextImpl = localAppContextImpl;

                                        event.rerouteTo(ApplicationMainView.class);

                                    }else {
                                        Notification.show("Your access has been expired, Please contact your administrator", 5000, Position.BOTTOM_CENTER);
                                    }
                                } catch (AuthenticationFailedException e) {
                                    Notification.show("Authentication Failed, Please Reset Cookies And Try Again", 5000, Position.BOTTOM_CENTER);
                                } catch (Exception e){  
                                    e.printStackTrace();
                                    Notification.show("Unexpected Error Occurred, Please Reset Cookies And Try Again", 5000, Position.BOTTOM_CENTER);
                                }
                            }else {
                                System.out.println("Session context is null, creating new context");
                                appContextImpl = new InAppSessionContextImpl();
                                VaadinSession.getCurrent().setAttribute("context", appContextImpl);
                                event.rerouteTo(LoginView.class);
                            }
                        } else {
                            System.out.println("Session context is not null");
                            InAppSessionContextImpl localAppContextImpl = new InAppSessionContextImpl();
                            localAppContextImpl.setBLSessionContext(appContextImpl.getBLSessionContext());
                            localAppContextImpl.setModuleGroupList(appContextImpl.getModuleGroupList());
                            appContextImpl = localAppContextImpl;
                            event.rerouteTo(ApplicationMainView.class);
                        }

                    }
                });
            }
        });
    }

    public static void setBLSessionContext(IBLSessionContext iblSessionContext) {
        appContextImpl.setBLSessionContext(iblSessionContext);
    }

    public static void setModuleGroupList(List<ModuleGroupVO> moduleGroupList) {
        appContextImpl.setModuleGroupList(moduleGroupList);
    }

    private class InAppSessionContextImpl implements InAppSessionContext {
        private static final long serialVersionUID = 1L;

        private List<ModuleGroupVO> moduleGroupList;
        private IBLSessionContext iblSessionContext;
        private Map<String, Object> attributeMap;

        public InAppSessionContextImpl() {
            this.attributeMap = new HashMap<String, Object>();
        }

        @Override
        public List<ModuleGroupVO> getModuleGroupList() {
            return moduleGroupList;
        }

        public void setModuleGroupList(List<ModuleGroupVO> moduleGroupList) {
            this.moduleGroupList = moduleGroupList;
        }

        @Override
        public IBLSessionContext getBLSessionContext() {
            return iblSessionContext;
        }

        public void setBLSessionContext(IBLSessionContext iblSessionContext) {
            this.iblSessionContext = iblSessionContext;
        }

        @Override
        public IBLSession getBLSession() {
            if(iblSessionContext != null)
                return iblSessionContext.getBLSession();
            return null;
        }

        @Override
        public boolean isPermittedAction(String actionAlias) {
            if (getBLSessionContext() != null) {
                if (getBLSessionContext().getSessionAccessControl() != null) {
                    return getBLSessionContext().getSessionAccessControl().isPermittedAction(actionAlias);
                }
            }
            return false;
        }

        @Override
        public void setAttribute(String key, Object attribute) {
            attributeMap.put(key, attribute);
        }

        @Override
        public Object getAttribute(String key) {
            return attributeMap.get(key);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果用户未登录,则预期结果会重定向到登录页面,否则会重定向到主应用程序页面,但 AAACATInitListener 未监听。

Kas*_*rer 5

如果您使用 Spring,只需@Component向类添加注释即可。如果您不使用 Spring,请遵循 @codinghaus 的回答。