web-dev-qa-db-de.com

So erhalten Sie eine Sitzungszeitüberschreitungsmeldung mit Spring-Sicherheit

Ich möchte die Sitzungszeitüberschreitungsmeldung erhalten, wenn die Sitzung abläuft. Unten ist meine spring-security.xml

<http auto-config="true" use-expressions="true">
    <logout logout-success-url="/" invalidate-session="true" logout-url="/LogOut"/>
    <form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/>
    <session-management invalid-session-url="/?timeout=true">
        <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" />
    </session-management>
</http>

Nach meinem Wissen sollte der Code nach Ablauf der Sitzung nach /?timeout=true OR /Timeout?timeout=true umgeleitet werden. Und beim Abmelden sollte es zu / gehen. Aber in meinem Fall beim Abmelden wird auch auf invalid-session-url umgeleitet, daher bekomme ich immer ein Timeout für das normale Logout und das Session-Timeout.

Bitte helfen Sie mir, dies zu unterscheiden.

UPDATE

/logout-Anfrage enthält 

session = request.getSession();
session.invalidate();
session = null;
7
Prasanna Kumar

Ich habe es gelöst! Schreiben Sie stattdessen einen Filter, der von der Spring-Sicherheit abhängt.

Wenn jemand interessiert ist, kann er den folgenden Code verwenden: - 

import Java.io.IOException;
import Java.io.PrintWriter;
import Java.io.StringWriter;
import Java.text.MessageFormat;

import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.Apache.log4j.Logger;
import org.springframework.web.filter.OncePerRequestFilter;

public class FilterToGetTimeOut extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws IOException {
        try {
            if(request.getRequestURI().equals("/") || request.getRequestURI().equals("/Login/")){
                if(request.getSession().getAttribute("login") != null && (Boolean)request.getSession().getAttribute("login") == true){
                    response.sendRedirect(URL);     //After login page
                }
            } else if(request.getSession().getAttribute("login") == null && !request.getRequestURI().equals("/LogOut")){
                response.sendRedirect(request.getContextPath()+"/?timeout=true");   //If timeout is true send session timeout error message to JSP
            }
            filterChain.doFilter(request, response);
        } catch (Exception e) {
            //Log Exception

        }
    }
}

Fügen Sie diesen Filter in web.xml hinzu.

    <filter>
        <filter-name>FilterToGetTimeOut </filter-name> 
        <filter-class>package.FilterToGetTimeOut </filter-class> 
    </filter>
    <filter-mapping> 
        <filter-name>FilterToGetTimeOut</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 

Jetzt wird auch die Sitzung ungültig und ich kann das Sitzungszeitlimit auch verarbeiten.

5
Prasanna Kumar

Ich schlage vor, dass Sie sich abmelden mit:

HttpSession session= request.getSession(false);
    SecurityContextHolder.clearContext();
        if(session != null) {
            session.invalidate();
        }
        for(Cookie cookie : request.getCookies()) {
            cookie.setMaxAge(0);
        }
3
FreezY

Ich hatte ein ähnliches Problem 

  1. Wenn Sie sich mit einem Benutzer angemeldet haben, sagen Sie zzzz
  2. Sie haben den Browser geschlossen
  3. Wieder versuchen Sie, sich mit demselben Benutzer zzzz anzumelden
  4. Es konnte keine Anmeldung mit Nachricht für die maximale Sitzung überschritten werden

Der Code, den ich in meiner Sicherheitsdatei für den Frühling habe, lautet:

<session-management invalid-session-url="/?timeout=true">
<concurrency-control max-sessions="1" expired-url="/logout?timeout" />

Ich habe dieses Problem durch Hinzufügen des Session-Timeout-Eintrags in der Datei web.xml gelöst. Ich habe den Session-Timeout-Wert auf 5 Minuten gesetzt, die Anwendung erstellt und implementiert. Es funktioniert einwandfrei.

Das könnte jemandem helfen.

Danke, Atul

0
Atul

In Ihrem Fall geschieht Folgendes, wenn sich ein Benutzer abmeldet, die Sitzung zuerst ungültig gemacht wird und die Sitzungsverwaltung ausgelöst wird. Wenn die Sitzungsverwaltung eingeht und herausgefunden hat, dass die Sitzung bereits abgelaufen ist, wird die SessionTimeout-Seite umgeleitet. Daher ist es besser, die invalidate-session des logout-Tags auf false zu setzen.

<logout logout-success-url="/" invalidate-session="false" logout-url="/LogOut"/>
0
Eva Mariam

Definieren Sie in Ihrem Controller das Request-Mapping für die Logout-Success-URL und von dort zur Startseite. Ersetzen Sie beispielsweise Ihr Mapping wie folgt

<http auto-config="true" use-expressions="true">
<logout logout-success-url="/logoutSucess" invalidate-session="true" logout-url="/LogOut"/>
<form-login login-page="/Login" username-parameter="Name" password-parameter="Pwd"/>
<session-management invalid-session-url="/?timeout=true">
    <concurrency-control max-sessions="1" expired-url="/Timeout?timeout=true" />
</session-management>

definiere diese/logoutSucess im Controller mit @RequestMapping (value = "/ logoutSucess" -Methode = RequestMethod.GET)

0
Kunwar Babu