GWT- Web应用程序的历史管理

时间:2015-08-31 09:46:40

标签: gwt browser-history session-management

我正在为我的应用程序开发历史管理。我有两个视图,一个是登录,另一个是主应用程序。我添加了本地链接#login和#application。理想情况下,当用户打开应用程序时,他应该看到具有#login令牌的登录视图。它工作正常。然后,当他的凭据被验证时,他会使用令牌#application进入应用程序视图。当他退出时,他会回到#login。这一切都很好。但令我困扰的是,当我手动将#login中的链接令牌更改为#application时,即使我已经注销,主应用程序也会直接打开。但是当我在新选项卡中尝试相同的操作时,它可以正常工作。 该应用程序容易受到需要修复的攻击。 我需要一些帮助。

    //When application loads
    History.newItem("application",true);           
    //When login screen loads //     
    History.newItem("login",true); 

    //On change
    History.addValueChangeHandler(new ValueChangeHandler<String>(){   

        @Override     
        public void onValueChange(ValueChangeEvent<String> event) { 
            String historyToken   = event.getValue(); 
            if (historyToken.substring(0, 5).equals("login")) {
                login();   
            }
            if (historyToken.substring(0, 11).equals("application")) {
                     mainApplicationView();    
            }
     });

当我注销时,会调用login()方法,该方法将相关面板加载到RootPanel中,并且内部也有#login标记。此外,主应用程序面板将从rootpanel中删除。

1 个答案:

答案 0 :(得分:0)

错误在第二个条件下:

    History.addValueChangeHandler(new ValueChangeHandler<String>(){   

            @Override     
            public void onValueChange(ValueChangeEvent<String> event) { 
                String historyToken   = event.getValue(); 
                if (historyToken.substring(0, 5).equals("login")) {
                    login();   
                }
                if (historyToken.substring(0, 11).equals("application")) {
                    startApplication(); //it will again check if the session is valid. If not, login screen will show up. Else mainApplication.
                }
    });

我退出后,它不应该允许我在任何情况下看到应用程序页面。所以,我应该确保sessionID有效。我只在应用程序启动时执行了一次,但没有在History.addChangeHandler下执行。这是一个大错。

    String sessionID = Cookies.getCookie("JSESSIONID");
    if(sessionID == null) {
        login();
    } else {
        checkWithServer();
    }