Lehota pre HTTP session bez web.xml a odchytávanie vypršania v Spring MVC

Ako nakonfigurovať trvanie HTTP session, ak nemáme web.xml? A ako riešiť vypršanie HTTP session v Spring MVC?

HTTP session, trvanie a web.xml

Vo web.xml to bolo jednoduché. Vypršanie session po minúte neaktivity klienta dosiahneme cez:

<session-config>
    <session-timeout>-1</session-timeout>
</session-config>

Čo keď web.xml nemáme?

Urobíme si listener!

package sk.upjs.ics.novotnyr.springmvc;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

@WebListener
public class SessionListener implements HttpSessionListener {
    private Log logger = LogFactory.getLog(SessionListener.class);

    private static final int ONE_MINUTE = 1 * 60 /* seconds */;

    private static final int TEN_SECONDS = 10 /* seconds */;

    private int sessionDuration = TEN_SECONDS;

    public void sessionCreated(HttpSessionEvent sessionEvent) {     
        sessionEvent.getSession().setMaxInactiveInterval(sessionDuration);
        logger.info("Session created and timeout set to " + sessionDuration + " seconds");
    }

    public void sessionDestroyed(HttpSessionEvent sessionEvent) {
        logger.info("Session destroyed");
    }

}

Nastavením setMaxInactiveInterval() vieme programovo nastaviť dĺžku sedenia… pozor, ale! sú to sekundy.

Listener anotovaný cez @WebListener sa automaticky zaregistruje pri štarte aplikácie.

Spring MVC a vypršané sessions

Ak v Springu vyprší HTTP session, ktorá mala byť aktívne, nastane HttpSessionRequiredException.

Odchytávať ju môžeme v metóde anotovanej cez @ExceptionHandler, kde vrátime, podľa konvencií REST komunity, stavový kód 401 v HTTP. Trieda ControllerConfiguration bude obsluhovať výnimky vyhodené zo všetkých kontrolérov.

package sk.upjs.ics.novotnyr.springmvc;

import org.springframework.http.HttpStatus;
import org.springframework.web.HttpSessionRequiredException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;

@ControllerAdvice
public class ControllerConfiguration {
    @ExceptionHandler(HttpSessionRequiredException.class)
    @ResponseStatus(value = HttpStatus.UNAUTHORIZED, reason = "Unavailable or expired session")
    public void handleSessionExpired() {
        // no action is necessary
    }
}

Zdroje

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *