GWT的新手,哦!这个学习曲线......
所以,我正在测试我实现的身份验证功能:当通过AsyncCallback
查询当前用户的角色时,首先检查用户是否登录。这是在我自己的AsyncCallback
实现中完成的(参见How to redirect to login page after session expire in GWT RPC call)。如果发现未登录,则会发生以下情况:
Widget returnToWidget = RootPanel.get(MyApp.Default_RootPanel_Id).getWidget(0);
RootPanel.get().add(new LoginPage(returnToWidget));
并LoginPage
清除RootPanel
,添加虚拟FlowPanel
并弹出带有用户名/密码/提交小部件的DialogBox
。如果接受凭据,则添加到提交窗口小部件的ClickListener
会执行以下操作:
@Override
public void onSuccess() {
RootPanel.get().clear();
RootPanel.get().add(returnToWidget);
现在,这工作正常。为了解决实际问题,请允许我返回查询调用,该调用发生在MainPanel extends Composite
:
public MainPanel() {
final DockPanel dockPanel = new DockPanel();
initWidget(dockPanel);
final HorizontalPanel hPanel = new HorizontalPanel();
hPanel.add(new Button("TEST"));
authService.getUserRole(jSessionId, new AsyncCallback<Constants.UserRole>() {
@Override
public void onSuccess(UserRole currentUserRole) {
boolean isAdmin = currentUserRole.isAtLeast(Constants.UserRole.Administrator);
if (isAdmin) {
hPanel.add(createNewStudyButton);
}
hPanel.add(new Button("ButtonForAll"));
System.out.println("CODE EXECUTED!");
[...]
}
[...]
dockPanel.add(hPanel, DockPanel.NORTH);
System.out.println("THROUGH!");
}
当发生我的GWT应用程序时,MainPanel
在EntryPoint中实例化并添加到RootPanel
,导致控制台打印 THROUGH!,登录显示屏幕并在提供接受的管理员凭据后,已将MainPanel
的已传递实例添加到RootPane
。
不幸的是(这就是问题!),只显示了TEST按钮。控制台永远不会打印 CODE EXECUTED!。为什么@success
响应中的代码没有被执行?刷新页面时,会执行代码并显示所有按钮,因为authService.getUserRole
现在可以在不中断登录屏幕的情况下返回结果。
我真的非常喜欢repaint()
或类似的东西,但这个问题似乎更像是一个设计问题。
任何人都可以帮助我执行代码块,即使AsyncCallback
在返回结果之前进行了页面切换吗?
更新:
我的坏!发现问题,但没有解决,因为我不认为它在这个设计中是可解决的:
我的SecurityAsyncCallback引用了默认的AsyncCallback,在onSuccess(T result)
上,它只是将结果传递给默认的AsyncCallback,因此它到达了实际的调用者。我在设计中处理NotLoggedInException
抛出服务器端的设计,例如authService.getUserRole
是要在我的SecurityAsyncCallback
onFailure
中抓住它并显示登录屏幕...但是从这里我无法重新运行导致onFailure
的代码,以便调用者将体验onSuccess
,因为用户现在已登录; AsyncCallback
接口只是一个中介,用于在调用者和被调用者之间传递结果,并且不知道调用了什么。
嗯,我真正追求的是,当用户深入我的应用程序,离开他的计算机和他的登录时间时,我希望登录页面显示在下一个服务器端访问,然后重定向他到他来自哪里(也就是说,登录后不回到默认页面)。我想我可以通过使用History子系统来实现这一点,但我还没有尝试过这个。