【问题标题】:GWTP: clear presenters on logoutGWTP:注销时清除演示者
【发布时间】:2012-11-29 14:43:56
【问题描述】:

我在我的 GWT 应用程序中使用 GWTP 并具有以下架构:

LoginPresenter (Presenter)
    DashboardPresenter (TabContainerPresenter)
        TabbedPresenter1 (Presenter)
        TabbedPresenter2 (Presenter)
        TabbedPresenter3 (Presenter)

第一次启动我的应用程序时,在 DashboardPresenter 中调用 onBind 和 addTab 方法,当我导航到选项卡时,在该演示者上调用 onbind 方法。

如果我创建一个 PlaceRequest 并通过我的 PlaceManager 导航回 LoginPresenter(通过按注销按钮),我将返回到登录演示者。

问题是,如果我再次登录,那么所有的 onBind 方法都不会被调用,因为它们仍在内存中。 onReset 和 onReveal 被正确调用,但我非常希望每个 Presenter 都被重置,并且每次登录时都会调用 onBind。

如果用户没有足够的权限查看这些选项卡,我决定登录事件哪些选项卡应该对用户可见,并在 DashboardPresenter 的 addTab 方法中限制选项卡。但截至目前,这些选项卡是在用户第一次登录时设置的,但不会在下次登录时设置。这意味着如果具有较少权限的用户在管理员用户之后登录,他可以看到与管理员相同的选项卡。不好!

我应该如何处理这个问题?我非常想在用户注销(导航到登录页面)时“重置”所有演示者或会话。是不是需要“重置”Ginjector,使其不会返回与之前相同的绑定对象?

澄清一下:我们确实有服务器端安全性,它禁止无权访问敏感数据的用户。但是当用户登录时,gwt 应用程序会收到用户可以访问的功能列表。这用于自定义 UI 以适应用户的权限。 (例如,根据用户权限自定义可见选项卡)。

【问题讨论】:

  • 我应该补充一点,我目前没有在演示者上使用 unbind 方法,因为我不确定调用这些方法时究竟会发生什么。
  • 目前,我的解决方案是使用 Window.Location.reload() 重新加载完整的页面。我不是很喜欢这个,但它确实有效。在注销事件中“重置”我的网络应用程序仍然需要一个好的解决方案......
  • 仅供参考,onUnBind() 方法应手动调用,因此它们不适用于您的情况(参见stackoverflow.com/questions/13396992/…)。

标签: gwt gwtp


【解决方案1】:

我不确定这是否有效:

但是您可以尝试在全局 EventBus 上触发 LogoutEvent ,处理所有需要“卸载”的 PresentersTabbedPresenter1 等)并在它们上调用 onUnbind()。 然后导航回LoginPresenter

或者,您可以为我们创建一个自定义 TabData(子类 TabDataBasic 并添加一个标志 hasAccess)。 你再次触发LogoutEvent,当你处理它时,你可以做这样的事情:

TabDataDynamic tabData = (TabDataDynamic)getProxy().getTabData();
tabData.setHasAccess(false);
getProxy().changeTab(tabData);

在你的TabPanel 实现中,当标志设置为 false 时,你必须确保选项卡是隐藏的。

【讨论】:

    【解决方案2】:

    我认为你应该看看 GateKeeper,它可以很容易地与以下演示者一起使用:

    @ProxyCodeSplit
    @NameToken(NameTokens....)
    @UseGatekeeper( Your1GateKeeper.class)
    public interface MyProxy extends TabContentProxyPlace<YourPresenter> {
    }
    

    您可以向 GateKeeper 注入 Dashboard Presenter 以检查此选项卡是否可用:

    @Singleton
    public class Your1GateKeeper implements Gatekeeper{
    
     private DashboardPresenter presenter;
    
     @Inject
     public ReadOnlyGateKeeper(DashboardPresenter presenter) {
        this.presenter = presenter;
     }
    
     @Override
     public boolean canReveal() {
        return presenter.isAvailable();
     }
    
    }
    

    因此,使用适当的 GateKeeper 可以让您达到所需的安全性。

    【讨论】:

    • 我的 DashboardPresenter 上已经有一个 Gatekeeper,但我没想到我的 TabbedPresenter 上有一个 Gatekeeper,所以我肯定会添加它。谢谢你,基里尔!但它并没有解决我卸载/解除绑定演示者的问题,还是我误解了?
    • 我建议将显示逻辑从 onBind 移到 Gatekeeper。所以你不需要处理卸载。不要以为真正的卸载是可达的,但你可以很容易地不显示一些标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多