2014-06-10 69 views
0

我想为会话超时使用primefaces的空闲监视器。 正常工作。但重定向到我的登录页面(login.xhtml它不工作通过idlemonitor(primefaces)超时不起作用

我用这个空闲监视器在我的我的XHTML页面模板的身体: 的template.xhtml

<p:idleMonitor timeout="1800000" > 
    <p:ajax event="idle" listener="#{pageServiceBean.timeout()}" oncomplete="alert('Die Session ist abgelaufen.')"/> 
</p:idleMonitor> 

的pageServiceBean的代码是: PageServiceBean.xhtml

@ManagedBean 
@SessionScoped 
/**Die Page-Service Bean wird in der Fußzeile der Seite eingesetzt und beinhaltet den Zurück-Button bzw. den Logout Button*/ 
public class PageServiceBean implements Serializable{      
    /** 
    * 
    */ 
    private static final long serialVersionUID = 3251724422690388588L; 

    /**Leitet auf zur Auswahlseite zurück*/ 
    public String cancel(){ 
     return"/sampleForDB.xhtml"; 
    } 

    /**Leitet zur Loginseite zurück*/ 
    public String cancelSampleButton(){  
     return"/login.xhtml"; 
    } 

    public void timeout() throws IOException { 
     FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); 
     FacesContext.getCurrentInstance().getExternalContext().redirect("...login.xhtml"); 

    } 


} 

我没有重定向到login.xhtml但用户ist注销。所以这些东西不再有效了。其他功能(取消和cancelSampleButton)的作品。所以他们导航到正确的页面。

我看了一下Answer in another post的答案但是这并没有解决我的问题。 在这篇文章中,这个人说要在web.xml中设置时间。但我不知道我在xhtml中写了哪些代码。 而且我不知道重定向方法中的三个点是做什么的FacesContext.getCurrentInstance().getExternalContext().redirect("...login.xhtml");

任何想法?

回答

0

我找到了解决方案。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:p="http://primefaces.org/ui"> 

<h:head></h:head> 
<body> 
    <h:form> 
    <p:growl id="msg" showDetail="true" sticky="true" /> 

    <!-- nach 10 Sekunden wird der idelDialog gestartet --> 
    <p:idleMonitor timeout="10000" onidle="idleDialog.show()" /> 

    <p:confirmDialog id="confirmDialog" 
     message="Die Session ist abgelaufen. Bitte klicke auf Ok um weiter zu arbeiten." 
     header="Session ist abgelaufen" severity="alert" widgetVar="idleDialog"> 

     <p:commandButton id="confirm" value="Ok" update="msg" 
      oncomplete="idleDialog.hide()" 
      actionListener="#{pageServiceBean.welcomeListener}" /> 

     <p:commandButton id="Logout" value="Abmelden" update="msg" 
      oncomplete="idleDialog.hide()" 
      actionListener="#{pageServiceBean.logoutListener}" /> 

    </p:confirmDialog> 

    </h:form> 
</body> 
</html> 

在任何XHTML页面其中使用空闲监视器:

<div id="idle"> 
    <div id="id"> 
     <ui:insert name="idle"> 
      <ui:include src="/META-INF/templates/PrimefacesIdleMonitor.xhtml"/> 
     </ui:insert> 
    </div> 
</div> 

PageServiceBean.java

在XHTML页PrimefacsIdleMonitor.xhtml

public void welcomeListener() { FacesContext.getCurrentInstance().addMessage( null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Hallo", "Du bist wieder eingeloggt.")); } public void logoutListener() throws IOException { FacesContext.getCurrentInstance().addMessage( null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Du bist ausgeloggt!", "Bis dann")); FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); ExternalContext ec =FacesContext.getCurrentInstance().getExternalContext(); System.out.println(ec.getRequestContextPath()+"/login.xhtml"); ec.redirect(ec.getRequestContextPath()+"/login.xhtml"); FacesMessage msg = new FacesMessage("Information ", " Die Session ist abgelaufen. Bitte melden sie sich erneut an."); FacesContext.getCurrentInstance().addMessage(null, msg); } 

如果用户点击“确定”,他可以再次工作。如果他弹出注销,他将重定向到登录后台。没有错误或其他东西是扔。