2010-07-22 5 views
6

Caso 1: Esci: Una volta che registriamo fuori, se si cerca di accedere al precedente, è necessario reindirizzare automaticamente login.jspCome distinguere tra il logout e la sessione scaduta?

Caso 2: Sessione scaduta: Se la sessione scade quando l'utente sta ancora effettuato l'accesso, si deve prova a reindirizzare automaticamente a sessionExpired.jsp quando si accede alla pagina precedente.

Come differenziare? Al momento sto annullando la sessione al momento del logout.

risposta

8

su login, impostare un cookie con una lunga scadenza (> 24 ore). Rimuovere questo cookie al momento del logout impostando il valore massimo su 0.

È possibile controllare gli utenti che non hanno effettuato l'accesso (ad esempio, ID di sessione non valido). Se il cookie non esiste, reindirizzare lui login.jsp

Se esiste il cookie, vuol dire la sua sessione scaduto così gli reindirizzare alla sessione-expired.jsp

+0

Grazie. Ho intenzione di implementarlo. – Prabhat

+0

se provo a ricreare un cookie usando il plugin firefox webdeveloper, il codice potrebbe fallire. –

1

Se fossi in grado di cancellare la sessione in uscita e creare un bool in esso chiamato HasLoggedOut, impostare su true. Quindi, se questo bool esiste in sessione, sai che sono stati disconnessi, in caso contrario la sessione è scaduta o l'utente non ha mai effettuato l'accesso.

Mentre ancora cant distinguere tra cronometrato fuori e non collegato normalmente prendere la decisione che se richiedono una pagina autenticato Mi limito a inviarli alla pagina timeout della sessione che funge anche da una pagina di login che dice qualcosa come

"Oops, non sappiamo chi sei, o la sessione è scaduta o non hai ancora eseguito l'accesso in basso"

rivolge Questa poi per entrambi gli scenari

+0

Grazie. È una buona idea, tuttavia mostrare che sei nuovo utente o che la tua sessione è scaduta non sembra buona. – Prabhat

7

È possibile verificare le sessioni scadute controllando se HttpServletRequest#getRequestedSessionId() non restituisce null (il che significa che il client ha inviato un cookie di sessione e quindi presuppone che la sessione sia ancora valida) e HttpServletRequest#isRequestedSessionIdValid() restituisce false (che significa che la sessione è scaduta dal lato server).

In un dado:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws ServletException, IOException { 
    HttpServletRequest request = (HttpServletRequest) req; 
    HttpServletResponse response = (HttpServletResponse) res; 
    HttpSession session = request.getSession(false); 

    if (request.getRequestedSessionId() != null && !request.isRequestedSessionIdValid()) { 
     response.sendRedirect(request.getContextPath() + "/sessionexpired.jsp"); 
    } else if (session == null || session.getAttribute("user") == null) { 
     response.sendRedirect(request.getContextPath() + "/login.jsp"); 
    } else { 
     chain.doFilter(request, response); 
    } 
} 

Non c'è bisogno di complicarsi la vita con i biscotti in più. Mappa questo Filter su un url-pattern che copre le pagine protette (e quindi escludendo le pagine sessionexpired e login!).

Non dimenticare di disabilitare il caching delle pagine dal browser sulle pagine protette, altrimenti il ​​browser le carica dalla cache quando torni nella cronologia del browser, invece di inviare una nuova richiesta al server. È possibile ottenere ciò facendo quanto segue nello stesso filtro, prima della chiamataChain#doFilter().

response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
response.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
response.setDateHeader("Expires", 0); // Proxies. 
+0

Se sto reindirizzando da una pagina all'altra, lascia che la pagina del tipo di accesso (seleziona login google o accesso predefinito) alla pagina di accesso, entrambe avvengono prima di accedere, esegue il reindirizzamento del codice sopra alla pagina scaduta sessione? – Dileep

+0

Capito la risposta sopra ma cosa succederà se implementiamo il meccanismo di autenticazione di base http ..prima di colpire qualsiasi URL o servlet sul lato server, genererà 401 al client .. come gestire in questo caso? –

+0

Sostituire semplicemente con l'autenticazione FORM se si desidera un controllo più fine. – BalusC