我在我的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以适合用户的权限。 (例如,根据用户权限自定义可见选项卡)。
答案 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可以让您达到所需的安全性。