【问题标题】:Timeout via idlemonitor (primefaces) does not work通过 idlemonitor (primefaces) 超时不起作用
【发布时间】:2014-07-31 11:53:00
【问题描述】:

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

我在我的 xhtml 页面模板正文中使用了这个空闲监视器: 模板.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。但用户已注销。所以这些东西不再有效。到其他功能(取消和cancelSampleButton)的作品。所以他们导航到正确的页面。

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

有什么想法吗?

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    我找到了解决办法。

    在 xhtml 页面 PrimefacsIdleMonitor.xhtml:

    <!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

    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); 
        }
    

    如果用户单击“确定”,他可以再次工作。如果他单击注销,他将被重定向到重新登录。没有错误或其他东西被抛出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2017-02-18
      • 2011-09-15
      • 2016-06-29
      相关资源
      最近更新 更多