2009-06-23 14 views
18

Questa domanda è correlata alla mia altra domanda "How to redirect to Login page when Session is expired in Java web application?". Qui di seguito è quello che sto cercando di fare:Gestione 'sessione scaduta' nell'applicazione Web JSF, in esecuzione in JBoss AS 5

  1. Ho un'applicazione JSF web in esecuzione su JBoss AS 5
  2. Quando l'utente è inattivo per, diciamo 15 minuti, ho bisogno di uscire l'utente e reindirizzarlo alla pagina di accesso, se sta cercando di utilizzare l'applicazione dopo che la sessione è scaduta.
  3. Quindi, come suggerito in "JSF Logout and Redirect", ho implementato un filtro che verifica la condizione di scadenza della sessione e reindirizza l'utente a una pagina di sessione scaduta-out.jsp, se la sessione è scaduta.
  4. Ho aggiunto SessionExpiryCheckFilter sopra tutte le altre definizioni di filtro in web.xml, in modo che il controllo della scadenza della sessione ottenga sempre il primo hit.

Ora arriva la sfida Mi trovo di fronte. Dal momento che sto usando JBoss AS, quando la sessione è scaduta, JBoss mi reindirizza automaticamente alla pagina di accesso (si noti che il filtro di controllo scadenza sessione non è stato richiamato). Quindi, dopo aver effettuato l'accesso, il mio SessionExpiryCheckFilter intercetta la richiesta e vede una sessione disponibile. Ma, getta l'eccezione javax.faces.application.ViewExpiredException: viewId:/mypage.faces - View /mypage.faces could not be restored.

Qualcuno ha già affrontato questo problema prima? Qualche idea per risolvere questo problema?

+0

Stai utilizzando Seam? –

+0

No. Non sto usando Seam. – Veera

+0

Stai utilizzando Facelets o JSP? – mtpettyp

risposta

15

L'approccio seguito funziona per me. Nota che devi utilizzare il reindirizzamento del taglib del core JSTL e non il reindirizzamento jsp per far sì che funzioni (dato che anche il jsp scade).

Nella tua FacesConfig.xml si inserisce il seguente:

<error-page> 
    <exception-type>javax.faces.application.ViewExpiredException</exception-type> 
    <location>/sessionExpired.jsf</location> 
</error-page> 

sessionExpired.jsp:

<%@page contentType="text/html" pageEncoding="UTF-8"%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
"http://www.w3.org/TR/html4/loose.dtd"> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<c:redirect url="/login.jsf" /> 

È inoltre possibile utilizzare questo approccio per altri tipi di errore o eccezioni. Per esempio l'elemento contiene una mappatura tra un codice di errore o di tipo di eccezione e il percorso di una risorsa nell'applicazione web .:

<error-page> 
    <error-code>400</error-code> 
    <location>/400.html</location> 
</error-page> 

o elemento contiene un nome di classe completo di un tipo di eccezione Java.

<error-page> 
    <exception-type>javax.servlet.ServletException</exception-type> 
    <location>/servlet/ErrorDisplay</location> 
</error-page> 
3

Se si utilizza Mojarra/Sun RI, è possibile provare ad aggiungere questo al proprio sito Web.xml:

<context-param> 
    <param-name>com.sun.faces.enableRestoreView11Compatibility</param-name> 
    <param-value>true</param-value> 
</context-param> 

Tuttavia essere consapevoli che questo non è sempre la soluzione perfetta. Nasconde il fatto che l'utente abbia perso la sessione.

+0

Questa non è la soluzione migliore. – Makky

1

Implementare javax.faces.event.PhaseListener per il ripristino vista

@Override 
public void afterPhase(PhaseEvent event) { 
    FacesContext facesContext = event.getFacesContext(); 
    if(facesContext.getViewRoot()==null){ 
     try{ 
      facesContext.getExternalContext().redirect(HOME_PAGE); 
      facesContext.responseComplete(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void beforePhase(PhaseEvent event) {} 

@Override 
public PhaseId getPhaseId() { 
    return PhaseId.RESTORE_VIEW; 
} 

registro in faces-config.xml

0

Ho cercato di scrivere un filtro per esso, ma in qualche modo non funzionava per me , quindi ho fatto un supplente per questo.

ho fatto come questo in ogni pagina che io non voglio all'utente di accedere senza accesso:

<f:view> 
    <h:dataTable value="#{userHome.validuser()}"/> 
    // my code 
<f:view/> 

Questa chiamerà la funzione validuser() che è nella mia sessione bean gestito.

Ora questa è la mia funzione. Durante l'accesso ho già inserito l'oggetto utente nella sessione.

public void validuser() 
{ 
    FacesContext context = FacesContext.getCurrentInstance(); 
    UserLogin ul = (UserLogin) context.getExternalContext().getSessionMap().get("userbean"); 

    if (ul == null) 
     try{ 
       context.getExternalContext().redirect("/HIBJSF/faces/LoginPage.xhtml"); 
       context.responseComplete(); 
     } 
     catch (IOException e) 
     { 
     e.printStackTrace(); 
     } 
} 

Se c'è una sessione, ma nessuno aveva effettuato l'accesso, allora vi porterà ad una pagina di reindirizzamento.

Problemi correlati