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
- zdrojové kódy na Githube
- riešenie s exception handlerom sa opiera o Adrian Matei: How to Handle Session Timeout Exceptions in Spring MVC. Tuto však používame explicitnú triedu s
@ControllerAdvice
. - Fruzenshtein’s Notes: Spring Java Configuration: Session timeout. V tomto prípade však registrujeme listener cez anotáciu a nie cez ručnú registráciu v inicializáciu.