Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当用户登录GWTP时,如何修复gui中的delema控制?_Gwt_Gwtp - Fatal编程技术网

当用户登录GWTP时,如何修复gui中的delema控制?

当用户登录GWTP时,如何修复gui中的delema控制?,gwt,gwtp,Gwt,Gwtp,好吧,这是我的困境: 我得到了一个标题presenter,它是嵌套的presenter。Customer presenter是Header presenter的子级(即Customer presenter被放入Header presenter的插槽中) 标题演示者中有登录面板 -以下是要求: -如果用户尚未登录,则无法看到Customer presenter的任何Gui -当用户成功登录时,它将在Customer presenter的Gui中显示 -当用户刷新页面时,系统将检查客户是否登录。如果

好吧,这是我的困境:

我得到了一个标题presenter,它是嵌套的presenter。Customer presenter是Header presenter的子级(即Customer presenter被放入Header presenter的插槽中)

标题演示者中有登录面板

-以下是要求

-如果用户尚未登录,则无法看到Customer presenter的任何Gui

-当用户成功登录时,它将在Customer presenter的Gui中显示

-当用户刷新页面时,系统将检查客户是否登录。如果他/她确实登录,则系统将显示客户演示者的Gui。如果他/她尚未登录,则提示错误消息

这就是我所做的

在Header presenter中,我有一个方法
loginedSuccessfully()
,该方法将
passUserInfo()
(使用
eventBus
)导入Customer presenter

在Customer presenter中,我有:

private int custID=0;
public void onReset(){
   super.onReset();
   if(custID>0){
       showGui();
   }
   else{
       hideGui(); // the hideGui() has Window.alert("Pls Login");
   }
}
private PassUserInfoHandler passUserInfoHandler=new PassUserInfoHandler(){

    @Override
    public void onPassUserInfo(PassUserInfoEvent event) {
       custID=event.getCustID();
       if(custID>0){
           showGui();
       }
       else{
          hideGui();
       }
    }

};
当用户刷新客户页面时。将调用重置时的
onReset
,如果客户尚未登录,则不会显示Gui并提示消息

当用户通过单击登录按钮登录时,将调用
passUserInfoHandler
&如果登录正常,将显示Gui

但问题是。当用户已经登录时&如果我打开一个新的浏览器选项卡并重新打开客户页面,那么这次将调用
onReset
passUserInfoHandler
wae&页面两次提示消息。这不好

但为什么会这样

这是因为在调用
passUserInfoHandler
之前调用了
onReset
。这就是为什么检查gui方法被调用了两次

我使用了
Scheduler.get().schedulederferred(新命令(){};
,但它不起作用


您知道如何解决该问题,使其能够满足上述所有要求吗?

GWTP是一种成熟的体系结构。它还具有这样的API,您可以通过创建自定义的守门人类来防止某些演示者暴露自己。例如,如果您希望某些演示者仅在美国er登录后,您可以编写以下类:

@Singleton
public class LoggedInGatekeeper implements Gatekeeper {  

  private final CurrentUser currentUser;

  @Inject
  public LoggedInGatekeeper (
      final CurrentUser currentUser ) {
    this.currentUser = currentUser;
  }

  @Override
  public boolean canReveal() {
    return currentUser.isLoggedIn();
  }
}
然后,您只需将@UseGatekeeper注释添加到要保护的每个演示者的代理:

  @ProxyCodeSplit
  @NameToken("userSettings")
  @UseGatekeeper( LoggedInGatekeeper.class )
  public interface MyProxy extends ProxyPlace<MainPagePresenter> {}
@ProxyCodeSplit
@NameToken(“用户设置”)
@UseGatekeeper(LoggedInGatekeeper.class)
公共接口MyProxy扩展了ProxyPlace{}

我认为你应该去做,而不是手工写东西。即使一次可能是你的代码工作。但在功能上,你的代码中会出现一些新的错误。你可以参考这一点。

谷歌的一些人不使用GateKeeper来管理登录,我不这么认为。我在我的产品中使用了它。我没有遇到这样的问题。你能给我那个链接吗?天哪艾因说"哦,我忘了说,我不是每次都往返。相反,我第一次保存用户信息,然后每次我需要从服务器获取一些信息时,我也会检查用户是否有权在服务器端执行这些操作。这样,我的守门人中不需要任何调度器,如果黑客试图绕过它,我也不需要任何调度器e请求本身在服务器端被阻止(即使他可以看到一些菜单和按钮,如果他不能获取任何内容和做任何事情,也不会对他有多大帮助)"我认为你误解了对话。对话的摘要就像不要将调度呼叫写入GateKeeper。他只使用GateKeeper。他所说的正确阅读“我的GateKeeper中不需要任何调度”,每次RPC呼叫都不是好主意。但你如何管理不同的用户类型?例如:如果客户登录,则显示客户页面,但如果业务用户登录,则显示业务页面等,同时LoggedInGatekeeper仅处理1个通用登录?