2016-03-27 15 views
1

Ich möchte mein Servlet so programmieren, dass die Sitzung blockiert wird, ohne zu schließen, wenn der Benutzer für 10 Minuten inaktiv ist und den Benutzer auf die Seite sessionlocked.jsp umleitet.Benutzer auf bestimmte Seite umleiten, wenn Benutzer für eine bestimmte Zeit inaktiv ist

Ich habe diesen Code getestet, aber es funktioniert nicht.

session.setMaxInactiveInterval(10*60); 
if (request.getSession(false) == null) { 
    response.sendRedirect(url); 
} 

Wie kann ich das erreichen?

Antwort

-1

als documentation;

setMaxInactiveInterval (int Intervall)

Gibt die Zeit in Sekunden zwischen Client-Anfragen, bevor der Servlet-Container wird diese Sitzung ungültig machen.

So setMaxInactiveInterval Methode entspricht nicht Ihren Anforderungen, es ungültig die Sitzung.

Um den Benutzern eine gesperrte Seite anzuzeigen, haben Sie zwei Möglichkeiten;

Zuerst;

Verwenden Sie Filter, um die Sitzungszeit zu überprüfen, und wenn die Zeit abgelaufen ist, leiten Sie sie an lockedpage zurück, um die Zeit neu einzustellen.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpSession session = ((HttpServletRequest) request).getSession(false); 
    if (session == null) { 
     // ((HttpServletRequest) request).getSession(true); 
     // redirect to logout or anywhere you want, to create a session 
     return; 
    } 
    // Check if filter also work for sessionlocked.jsp 
    if (((HttpServletRequest) request).getRequestURL().toString().contains("sessionlocked")) { 
     chain.doFilter(request, response); // no need to check sessionlocked 
     return; 
    } 
    long lastAccessTime = session.getLastAccessedTime(); 
    long tenMinuteAsMilisecond = 10 * 60 * 1000; 
    if (lastAccessTime + tenMinuteAsMilisecond > (new Date()).getTime()) { 
     chain.doFilter(request, response); // session still not locked 
    } else { 
     ((HttpServletResponse) response).sendRedirect("sessionlocked.jsp"); 
    } 
} 

Zweite (Neben Erstens, weil Erster Versuch auf Server-Seite gesteuert);

Verwenden Sie Javascript, um zu zählen, und wenn die Zeit vorbei ist, umleiten Benutzer auf die gesperrte Seite.

window.onload = function() { 
     setInterval(function() { 
      window.location.replace("/sessionlocked.jsp"); 
       }, 600000); 
    } 

wenn nur Servlet benötigen; (bei Benutzerinteraktion mit Servlet)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    HttpSession session = request.getSession(false); 
    if (session == null) { 
     request.getSession(true); 
     // redirect to logout or anywhere you want, to create a session 
     return; 
    } 
    long lastAccessTime = session.getLastAccessedTime(); 
    long tenMinuteAsMilisecond = 10 * 1000;// to test lock time set to 10 seconds 
    if (lastAccessTime + tenMinuteAsMilisecond > (new Date()).getTime()) { 
     response.getOutputStream().print("Session not locked" + i++); 
     // TODO for not locked code 
    } else { 
     response.getOutputStream().print("Session locked"); 
     //redirect to sessionlocked.jsp 
    } 
} 

Servlet-Ausgabe (Sperrzeit auf 10 Sekunden eingestellt); Servlet output

+1

Filterversuch funktioniert nicht, wenn die Sitzung abgelaufen ist (getSession() gibt Ihnen eine neue). JS-Versuch führt zu seltsamen Ergebnissen, wenn der Client mehrere Seiten (Registerkarten/Fenster) in derselben Sitzung geöffnet hat. Keines von beiden ist der richtige Ansatz für die Anforderung, einen Benutzer sofort umzuleiten, wenn die Sitzung auf der Serverseite abgelaufen ist. – BalusC

+0

@BalusC Ich bearbeite noch die Antwort, vermutete das und füge einen Kommentar über den Code, ich denke, Antwort ist nicht verdient -1 Punkt, es ist eine ungeduldige Aktion :) –

+0

Die Antwort ist in seiner aktuellen Form einfach falsch. Natürlich wird der Downvote entfernt, wenn der Beitrag so korrigiert wird, dass er tatsächlich die konkrete Anforderung beantwortet und löst und alle möglichen Vorbehalte beschreibt, wenn eine Problemumgehung anstelle einer Lösung vorgeschlagen wird. – BalusC

Verwandte Themen