通过idlemonitor(primefaces)超时不起作用

问题描述 投票:0回答:2

我想使用 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。但用户已注销。所以这些东西不再有效了。其他功能(cancel 和cancelSampleButton)有效。因此他们导航到正确的页面。

我查看了另一篇文章中的答案的答案,但这并没有解决我的问题。 在这篇文章中,该人谈到在 web.xml 中设置时间。但我不知道我在 xhtml 中写了哪些代码。 而且我不知道重定向方法中的三个点是做什么的

FacesContext.getCurrentInstance().getExternalContext().redirect("...login.xhtml");

有什么想法吗?

jsf-2 primefaces
2个回答
0
投票

我找到了解决方案。

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

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


0
投票

问题是会话超时是否在用户单击对话框之前结束

我找不到解决方案

© www.soinside.com 2019 - 2024. All rights reserved.