Shiro/Vaadin在页面重新加载时丢失会话

Shiro/Vaadin在页面重新加载时丢失会话,vaadin,reload,shiro,Vaadin,Reload,Shiro,我将Shiro会话管理(基于)添加到Vaadin quick ticket dashboard演示应用程序中。当我在应用程序中重新加载浏览器时,我会返回到没有会话的登录页面。我如何/在哪里可以防止这种情况发生 我有一个标准的shiro.ini设置 登录按钮处理程序: signin.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent e

我将Shiro会话管理(基于)添加到Vaadin quick ticket dashboard演示应用程序中。当我在应用程序中重新加载浏览器时,我会返回到没有会话的登录页面。我如何/在哪里可以防止这种情况发生

我有一个标准的shiro.ini设置

登录按钮处理程序:

        signin.addClickListener(new ClickListener() {
        @Override
        public void buttonClick(ClickEvent event) {
            boolean loginOK = false;

            Factory<SecurityManager> factory = 
                    new IniSecurityManagerFactory("classpath:shiro.ini");
            SecurityManager securityManager = factory.getInstance();
            SecurityUtils.setSecurityManager((org.apache.shiro.mgt.SecurityManager) 
                                                            securityManager);

            Subject currentUser = SecurityUtils.getSubject();

            //collect user principals and credentials in a gui specific manner 
            //such as username/password html form, X509 certificate, OpenID, etc.
            //We'll use the username/password example here since it is the most common.
            UsernamePasswordToken token = 
                    new UsernamePasswordToken(username.getValue(), password.getValue());

            //this is all you have to do to support 'remember me' (no config - built in!):
            token.setRememberMe(true);

            //currentUser.login(token);
            try {
                logger.log(Level.INFO, "trying login");
                currentUser.login( token );
                logger.log(Level.INFO, "login done");

                    //if no exception, that's it, we're done!
            } catch ( Exception e ) {
                logger.log(Level.INFO, "exception");
            }

            if ( currentUser.hasRole( "schwartz" ) ) {
                loginOK = true;
            } else {
                loginOK = false;
            }

            if (loginOK) {
                signin.removeShortcutListener(enter);
                buildMainView();
            } else {
                if (loginPanel.getComponentCount() > 2) {
                    // Remove the previous error message
                    loginPanel.removeComponent(loginPanel.getComponent(2));
                }
                // Add new error message
                Label error = new Label(
                        "Wrong username or password. <span>Hint: try empty values</span>",
                        ContentMode.HTML);
                error.addStyleName("error");
                error.setSizeUndefined();
                error.addStyleName("light");
                // Add animation
                error.addStyleName("v-animate-reveal");
                loginPanel.addComponent(error);
                username.focus();
            }
        }
    });
sign.addClickListener(新建ClickListener(){
@凌驾
公共作废按钮单击(单击事件){
布尔loginOK=false;
工厂=
新的InSecurityManager工厂(“类路径:shiro.ini”);
SecurityManager SecurityManager=factory.getInstance();
SecurityUtils.setSecurityManager((org.apache.shiro.mgt.SecurityManager)
证券经理);
Subject currentUser=SecurityUtils.getSubject();
//以特定于gui的方式收集用户主体和凭据
//例如用户名/密码html表单、X509证书、OpenID等。
//这里我们将使用用户名/密码示例,因为它是最常见的。
UsernamePasswordToken令牌=
新的UsernamePasswordToken(username.getValue(),password.getValue());
//这就是支持“记住我”(无配置-内置!)所需的全部操作:
token.setRememberMe(true);
//currentUser.login(令牌);
试一试{
logger.log(Level.INFO,“尝试登录”);
currentUser.login(令牌);
logger.log(Level.INFO,“登录完成”);
//如果没有例外,就这样,我们完了!
}捕获(例外e){
logger.log(Level.INFO,“异常”);
}
if(currentUser.hasRole(“schwartz”)){
loginOK=true;
}否则{
loginOK=false;
}
if(loginOK){
signin.removeShortcutListener(输入);
buildMainView();
}否则{
如果(loginPanel.getComponentCount()>2){
//删除以前的错误消息
loginPanel.removeComponent(loginPanel.getComponent(2));
}
//添加新的错误消息
标签错误=新标签(
“错误的用户名或密码。提示:请尝试空值”,
ContentMode.HTML);
错误。addStyleName(“错误”);
错误。setSizeUndefined();
错误。addStyleName(“灯光”);
//添加动画
错误。addStyleName(“v-animate-reveal”);
loginPanel.addComponent(错误);
username.focus();
}
}
});

在UI初始化类中使用@preserveonRefresh注释

我建议使用Shiro的web过滤器。这样,您的会话不会丢失,并且您可以轻松禁止未经授权的操作(例如实例化视图对象),因为当您显示登录或任何其他视图时,Shiro的上下文已经设置好了