GWTP:注销时清除演示者

GWTP:注销时清除演示者,gwt,gwtp,Gwt,Gwtp,我在我的GWT应用程序中使用GWTP,并具有以下体系结构: LoginPresenter (Presenter) DashboardPresenter (TabContainerPresenter) TabbedPresenter1 (Presenter) TabbedPresenter2 (Presenter) TabbedPresenter3 (Presenter) 我第一次启动应用程序时,会在DashboardPresenter中调

我在我的GWT应用程序中使用GWTP,并具有以下体系结构:

LoginPresenter (Presenter)
    DashboardPresenter (TabContainerPresenter)
        TabbedPresenter1 (Presenter)
        TabbedPresenter2 (Presenter)
        TabbedPresenter3 (Presenter)
我第一次启动应用程序时,会在DashboardPresenter中调用onBind和addTab方法,当我导航到某个选项卡时,会在该presenter上调用onBind方法

如果我创建PlaceRequest并通过PlaceManager按注销按钮导航回LoginPresenter,我将返回登录演示者

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

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

我该如何处理这件事?我非常希望在用户登录到登录页面时重置所有演示者或会话。是否需要重置Ginject,以便它不会返回与以前相同的绑定对象


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

我不确定这是否有效:

但您可以尝试在全局事件总线上触发LogoutEvent,在需要卸载的所有演示者中处理它,如TabbedPresenter1等,并对它们调用onUnbind。 然后导航回LoginPresenter

或者,您可以创建一个定制的TabData子类tabdatabase,并添加一个标志hasAccess。 再次触发LogoutEvent,当您处理它时,您可以执行以下操作:

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

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

我认为您应该看看“守门人”,它可以很容易地与演示者一起使用,如:

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

因此,使用适当的网关守卫将允许您达到所需的安全性。

我应该补充一点,我目前没有在演示者上使用解除绑定方法,因为我不确定调用这些方法时会发生什么。目前,我的解决方案是使用Window.Location.reload进行完整的页面重新加载。我不太喜欢这个,但它确实管用。在注销事件中重置我的web应用程序时仍然需要一个好的解决方案…仅供参考,onUnBind方法应该手动调用,因此它们不适用于您的情况。Cf.我的仪表板演示器上已经有一个守门人,但我不认为我的TabbedPresenter上有一个守门人,因此我肯定会添加它。谢谢你,基里尔!但这并不能解决我卸载/解除绑定演示者的问题,或者我误解了?我建议将显示逻辑从onBind移动到Gatekeeper。因此,您将不需要处理卸载。不要认为真正的卸载是可以到达的,但是您可以很容易地不显示某些选项卡。
@Singleton
public class Your1GateKeeper implements Gatekeeper{

 private DashboardPresenter presenter;

 @Inject
 public ReadOnlyGateKeeper(DashboardPresenter presenter) {
    this.presenter = presenter;
 }

 @Override
 public boolean canReveal() {
    return presenter.isAvailable();
 }

}