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

问题描述 投票:2回答:3

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

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

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);
        }
    }
}

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

vaadin vaadin-flow
3个回答
1
投票

要使Vaadin识别VaadinServiceInitListener,您必须创建一个名为com.vaadin.flow.server.VaadinServiceInitListener的文件并将其放在src/main/resources/META-INF/services下。它的内容应该是实现VaadinServiceInitListener接口的类的完整路径。是你做的吗?

你也可以在tutorial找到关于它的描述。


1
投票

如果您使用的是Spring,只需在类中添加一个@Component注释即可。如果您不使用Spring,请关注@codinghaus的回答。


1
投票

使用beforeEnter(..)的正确模式不是通过VaadinServiceInitListener来实现的,而是你应该在视图中实现BeforeEnterObserver接口,你需要使用它并用你的实现覆盖beforeEnter(..)方法。

public class MainView extends VerticalLayout implements RouterLayout, BeforeEnterObserver {
   ...
    @Override
    public void beforeEnter(BeforeEnterEvent event) {
         ...
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.