2015-08-05 4 views
0

Проблема заключается в том, что бранд сеанса не уничтожается до достижения таймаута сеанса.Уничтожить SessionScoped CDI beans во время выхода Siiro

Поэтому у меня есть два вопроса относительно следующей процедуры выхода из системы:

  1. это правильный способ использовать Shiro выход из системы (см выхода из системы() ниже)
  2. Что бы правильный способ уничтожить КДИ во время выхода из системы.

page.xhtml:

<p:commandLink ajax="false" actionListener="#{myOtherBean.logout}" /> 

бобы:

 
@Named 
@SessionScoped 
public class mySessionBean implements Serializable { 
} 

@Named 
@SessionScoped 
public class myOtherBean extends Observable implements Serializable { 
    @Inject 
    private Subject subject; 

    public void logout(){ 

     subject.logout(); 

// this line throws the exception 
FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 

     FacesContext.getCurrentInstance().getExternalContext() 
      .redirect(servlet.getContextPath() + "/logout"); 
    } 
} 

shiro.ini:

 
[main] 
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager 
securityManager.sessionManager = $sessionManager 
sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO 
securityManager.sessionManager.sessionDAO = $sessionDAO 
.... 
logout=org.apache.shiro.web.filter.authc.LogoutFilter 
logout.redirectUrl = /login.xhtml 

.... 
[urls] 
/logout = logout 

Исключение:

следующее исключение, когда я звоню FacesContext.getCurrentInstance().getExternalContext().invalidateSession();

 
java.lang.IllegalStateException: 
org.apache.shiro.session.UnknownSessionException: 
There is no session with id [e5939658-c033-4e67-984f-23cadfbc06fb] 

Дополнительная информация: Я бегу Wildfly 8.2.0.Final.

Спасибо.

+0

вы будете уверены, что он бросает, что на invalidateSession линии? скорее всего, это бросит его на subject.logout(). – teacurran

+0

Да, с тех пор как вы спросили, я проверил его снова, и я уверен. – sinclair

ответ

0

Вот код, я использую в моем проекте, чтобы сделать это, возможно, это потому, что ваш боб SessionScoped и шахта ViewScoped ?:

@Named 
@ViewScoped 
public class Authenticator implements Serializable { 

    public void logout() { 
     SecurityUtils.getSubject().logout(); 
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     FacesContext.getCurrentInstance().getExternalContext().redirect(LOGIN_URL); 
    } 
} 
+0

Спасибо, но он не работает, даже если я использую @ViewScoped. Я обновил свой вопрос. – sinclair

Смежные вопросы