GWTP:在注销时清除主持人

时间:2012-11-29 14:43:57

标签: gwt gwtp

我在我的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方法中的选项卡。但截至目前,标签是在用户首次登录时设置的,但下次不是。这意味着如果具有较少权限的用户在管理员用户之后登录,则他可以看到与管理员相同的选项卡。不好!<​​/ p>

我该如何处理?我非常希望在用户注销(导航到登录页面)时“重置”所有演示者或会话。是否需要“重置”Ginjector,以便它不会像以前一样返回相同的绑定对象?

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

2 个答案:

答案 0 :(得分:0)

我不确定这是否有效:

但您可以尝试在全局LogoutEvent上触发EventBus,在需要“卸载”(Presenters等)的所有TabbedPresenter1中处理它给他们打电话onUnbind()。 然后导航回LoginPresenter

或者,您可以使用自定义TabData(子类TabDataBasic并添加标记hasAccess)。 再次点燃LogoutEvent,当你处理它时,你可以做类似的事情:

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

在yout TabPanel实现中,当标志设置为false时,您必须确保隐藏Tab。

答案 1 :(得分:0)

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

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

您可以将一个仪表板演示者注入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();
 }

}

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