Spring Тайм-аут загрузочного сеанса
server.session-timeout
похоже, работает только для встроенного tomcat.
Я поставил оператор журнала для проверки интервала времени сеанса. После развертывания военного файла вручную в tomcat я понял, что значение тайм-аута сеанса по умолчанию (30 минут) все еще используется.
Как установить значение тайм-аута сеанса с помощью spring -boot (не для встроенного tomcat, а для автономного сервера приложений)?
Ответы
Ответ 1
На всякий случай кто-то найдет это полезным:
если вы используете Spring Security, вы можете расширить класс SimpleUrlAuthenticationSuccessHandler и установить тайм-аут сеанса в обработчике успеха проверки подлинности:
public class NoRedirectSavedRequestAwareAuthenticationSuccessHandler
extends SimpleUrlAuthenticationSuccessHandler {
public final Integer SESSION_TIMEOUT_IN_SECONDS = 60 * 30;
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws ServletException, IOException {
request.getSession().setMaxInactiveInterval(SESSION_TIMEOUT_IN_SECONDS);
// ...
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.loginProcessingUrl("/login")
.successHandler(new NoRedirectSavedRequestAwareAuthenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler())
.and().httpBasic();
}
}
Ответ 2
При развертывании приложения Spring Boot на автономный сервер настройка таймаута сеанса выполняется так же, как и в любом другом военном развертывании.
В случае Tomcat вы можете установить тайм-аут сеанса, настроив атрибут maxInactiveInterval
в элементе менеджера в server.xml
или используя элемент session-timeout
в web.xml. Обратите внимание, что первый параметр будет влиять на каждое приложение, развернутое в экземпляре Tomcat.
Ответ 3
Вы обнаружили, что у меня нет прямого вызова в API Servlet и API Spring для установки таймаута сеанса. Потребность в нем обсуждается здесь и там, но она еще не была рассмотрена.
Там вроде круглый способ сделать то, что вы хотите. Вы можете настроить прослушиватель сеанса, который устанавливает тайм-аут в сеансе. Я наткнулся на статью с примерами кода: http://fruzenshtein.com/spring-java-configuration-session-timeout
Я надеюсь, что это поможет.
Ответ 4
В вашем приложении application.properties
#session timeout (in secs for spring, in minutes for tomcat server/container)
server.session.timeout=1
Я тестировал его и работаю!
Оказывается, что tomcat берет свойство за считанные минуты
Ответ 5
Основываясь на ответе Джастина, показывающем, как установить время ожидания сеанса с помощью AuthenticationSuccessHandler
с Spring Security, я создал SessionTimeoutAuthSuccessHandler
:
public class SessionTimeoutAuthSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
public final Duration sessionTimeout;
public SessionTimeoutAuthSuccessHandler(Duration sessionTimeout) {
this.sessionTimeout = sessionTimeout;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws ServletException, IOException {
req.getSession().setMaxInactiveInterval(Math.toIntExact(sessionTimeout.getSeconds()));
super.onAuthenticationSuccess(req, res, auth);
}
}
В использовании:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().formLogin().loginPage("/login")
.successHandler(new SessionTimeoutAuthSuccessHandler(Duration.ofHours(8))).permitAll()
.and().logout().logoutUrl("/logout").permitAll();
}
...
}
Отредактируйте Расширение из SavedRequestAwareAuthenticationSuccessHandler
вместо SimpleUrlAuthenticationSuccessHandler
чтобы гарантировать, что исходные запросы не будут потеряны после повторной аутентификации.
Ответ 6
Используйте HttpSessionListener
@Configuration
public class MyHttpSessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
event.getSession().setMaxInactiveInterval(30);
}
}