Redirect automático - JSF + Primefaces

10 respostas
M

Como faço para que quando a sessão da aplicação expirar, automaticamente seja feito um redirecionamento para uma página informando que a sessão foi expirada?

Só consigo fazer isso quando há alguma interação, por exemplo, quando o usuário clica em algum botão, queria que a página fosse redirecionada automaticamente.

Já setei no web.xml

<error-page> <exception-type>javax.faces.application.ViewExpiredException</exception-type> <location>/faces/expirado.xhtml</location> </error-page>

obrigado!!

10 Respostas

R

Eu uso o componente idleMonitor do Primefaces, mas quando a sessão expira, eu mostro um dialog modal. Você poderia colocar um botão para sair do dialog e redirecionar para outra página. Assim a pessoa pode ler a mensagem dizendo que expirou e depois ser redirecionada.

M

Legal!! Era isso mesmo que eu queria!!
Agora como eu insiro um botão dentro dessa caixa de dialogo?

Muito obrigado!!

R

Dá uma olhada no exemplo do p:commandLink

M

me desculpa, sou novo ainda nisso.

O modal já está aparecendo, nele eu queria colocar o botão para logar novamente.

Tenho o arquivo IdleMonitorController que esta da seguinte forma
@SessionScoped
@Named
public class IdleMonitorController implements Serializable {
    
    public void idleListener() {  
        System.out.println("aqui ok");
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN,   
                                        "Sua sessão expirou", "Por favor faça o login novamente"));  
    
    }    
}

e o xhtml:

<p:growl id="messages" showDetail="true" sticky="true" />  
      
    <p:idleMonitor timeout="5000">  
        <p:ajax event="idle" listener="#{idleMonitorController.idleListener}" update="messages"/>                   
    </p:idleMonitor>

Tentei colocar o botão dentro do p:idleMonitor mas não aparece dentro do modal.

Como devo proceder?
Obrigado!

R

Você olhou o showcase do Primefaces?

<p:idleMonitor timeout="10000"   
            onidle="PF('idleDialog').show()" onactive="PF('idleDialog').hide()"/>  
              
<p:dialog header="What's happening?" resizable="false"  
            widgetVar="idleDialog" modal="true" width="400">  
    <h:outputText value="Dude, are you there?" />  
</p:dialog>

Veja que tem um dialog... é nele que você coloca o commandLink.

M
Roselito Fávero da Silva:
Você olhou o showcase do Primefaces?
<p:idleMonitor timeout="10000"   
            onidle="PF('idleDialog').show()" onactive="PF('idleDialog').hide()"/>  
              
<p:dialog header="What's happening?" resizable="false"  
            widgetVar="idleDialog" modal="true" width="400">  
    <h:outputText value="Dude, are you there?" />  
</p:dialog>

Veja que tem um dialog... é nele que você coloca o commandLink.

não sei porque, mas o SimpleIdleMonitor não está funcionando aqui, seria apenas colar este código na página xhtml certo?

<p:idleMonitor timeout="10000" 
			onidle="PF('idleDialog').show()" onactive="PF('idleDialog').hide()"/>
			
<p:dialog header="What's happening?" resizable="false"
			widgetVar="idleDialog" modal="true" width="400">
	<h:outputText value="Dude, are you there?" />
</p:dialog>

No AjaxIdleEvent funciona de boa, porém não sei inserir o botão usando ele.

Obrigado!!

R

Pode ser versão do Primefaces. Se for 3.x, mude onidle=“PF(‘idleDialog’).show()” para onidle=“idleDialog.show()

E cuidado que no exemplo, ao mover o mouse ele fecha o dialog - você tem que tirar o trecho do onactive e colocar o botão que você quer no dialog.

M

Roselito Fávero da Silva:
Pode ser versão do Primefaces. Se for 3.x, mude onidle=“PF(‘idleDialog’).show()” para onidle=“idleDialog.show()

E cuidado que no exemplo, ao mover o mouse ele fecha o dialog - você tem que tirar o trecho do onactive e colocar o botão que você quer no dialog.

Legal Roselito, muito obrigado!! Era isso mesmo, estou usando o primefaces 3.5

Consigo remover o botão fechar do modal?

Eu setei o timeout do idleMonitor para 10 minutos e o session-timeout do web-xml para 1 minuto para testar, passado mais de 1 minuto não é lançado a exceção de ViewExpiredException, assim a página continua ativa “por baixo” do modal, se o usuario clica em fechar ele consegue continuar usando o sistema, o que não deveria acontecer.

R

coloque closable=“false” (acho que é isso) que só consegue sair do modal pelo seu botão.

M

Perfeito!! Muito obrigado pela ajuda Roselito!!!

Criado 4 de outubro de 2013
Ultima resposta 7 de out. de 2013
Respostas 10
Participantes 2