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);
    }
}