SpringBoot의 세션 시간 초과 문제의 원인에 대한 자세한 설명
이 글은 주로 SpringBoot의 Session timeout 원리에 대한 자세한 설명을 소개하는 글인데 편집자가 꽤 좋다고 생각해서 지금 공유하고 참고용으로 올려보겠습니다. 편집자를 따라가서 살펴보자
1: 서문:
최근 결제 백그라운드에서 로그인 후 일정 기간 동안 작업이 없는 경우, 항상 다시 로그인해야 작업이 가능합니다. 이 문제의 원인은 세션 시간이 초과되었기 때문입니다. 코드를 디버깅한 후 세션 시간 초과가 1800초인 것으로 나타났습니다. 즉, 1800초 이내에 작업이 없으면 세션 시간이 초과됩니다. 그렇다면 이 제한 시간은 어떻게 설정됩니까? 그렇다면 이 시간 초과를 어떻게 재설정하나요? 세션 시간이 초과된 시기를 시스템은 어떻게 결정합니까? 다음으로 하나씩 답변해드리겠습니다.
2: 시스템 세션 시간 초과는 기본적으로 어떻게 설정되나요?
설명: 세션 시간 초과를 가져오는 방법은 "request.getSession().getMaxInactiveInterval()"이지만 tomcat에서 시간 초과를 설정하는 매개 변수는 "sessionTimeout"인데 어떻게 연결됩니까?
1단계: sessionTimeout 매개변수를 로드합니다.
1. 프로젝트 작업 초기화는 "@ConfigurationProperties" 주석을 통해 "org.springframework.boot.autoconfigure.web.ServerProperties" 클래스를 로드합니다.
//springBoot中默认的配置文件为"application.yml"或者"application.perties"文件,也就是说server是其中的一个配置参数。 @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true) public class ServerProperties implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered { //代码 }
2. 위 클래스의 "ServerProperties"는 "EmbeddedServletContainerCustomizer" 인터페이스에서 상속됩니다. 사용자 정의 메소드를 다시 작성한 다음 이 메소드를 "푸시업"하여 "AbstractConfigurableEmbeddedServletContainer" 클래스를 찾으십시오.
@Override public void customize(ConfigurableEmbeddedServletContainer container) { //多个参数判断,如果在application中没配置的情况下都是null if (getPort() != null) { container.setPort(getPort()); } ...//n多个参数判断, //以下的代码就是重点,因为是tomcat容器,所以以下条件为“真”,经过一系列的查找父类或者实现接口即可找到抽象类“AbstractConfigurableEmbeddedServletContainer” //public class TomcatEmbeddedServletContainerFactory extends AbstractEmbeddedServletContainerFactory implements ResourceLoaderAware //public abstract class AbstractEmbeddedServletContainerFactory extends AbstractConfigurableEmbeddedServletContainer implements EmbeddedServletContainerFactory if (container instanceof TomcatEmbeddedServletContainerFactory) { getTomcat().customizeTomcat(this, (TomcatEmbeddedServletContainerFactory) container); } //以上代码执行完成之后,实际上已经有对应的session所有的默认参数,之后通过下面方法,将所有参数放入对应的容器中。第3、4步就是设置过程 container.addInitializers(new SessionConfiguringInitializer(this.session)); }
3 "AbstractConfigurableEmbeddedServletContainer" 클래스에서 "timeout time" 관련 설정을 찾을 수 있습니다
//重要代码 //45行 private static final int DEFAULT_SESSION_TIMEOUT = (int) TimeUnit.MINUTES .toSeconds(30); //66行 private int sessionTimeout = DEFAULT_SESSION_TIMEOUT; @Override public void setSessionTimeout(int sessionTimeout) { this.sessionTimeout = sessionTimeout; } //171-188行 @Override public void setSessionTimeout(int sessionTimeout, TimeUnit timeUnit) { Assert.notNull(timeUnit, "TimeUnit must not be null"); this.sessionTimeout = (int) timeUnit.toSeconds(sessionTimeout); } /** * Return the session timeout in seconds. * @return the timeout in seconds */ public int getSessionTimeout() { return this.sessionTimeout; }
4. "Container.addInitializers(new SessionConfiguringInitializer(this.session))"의 2단계를 실행하여 모든 구성을 로드합니다. 매개변수 .
public static class Session { /** * Session timeout in seconds. */ private Integer timeout; public Integer getTimeout() { return this.timeout; } //将session超时时间设置进来 public void setTimeout(Integer sessionTimeout) { this.timeout = sessionTimeout; }
2단계: 위의 시간 초과 기간을 "MaxInactiveInterval" 매개변수에 할당합니다.
참고: 위의 tomcat에 필요한 모든 매개변수가 로드되었으므로 다음에는 tomcat이 실행됩니다. 여기에서는 자세한 내용을 다루지 않고 바로 tomcat 시작 및 매개변수 로딩 설명으로 이동합니다. "TomcatEmbeddedServletContainerFactory" 클래스의 메소드 호출 프로세스는 다음과 같습니다:
getEmbeddedServletContainer--》prepareContext--》configureContext--》configureSession--》getSessionTimeoutInMinutes.
1 tomcat
//以下代码 private void configureSession(Context context) { long sessionTimeout = getSessionTimeoutInMinutes(); context.setSessionTimeout((int) sessionTimeout); Manager manager = context.getManager(); if (manager == null) { manager = new StandardManager(); //此处即为设置相应的参数的位置。之后会调用StandardContext类的setManger(Manager)方法,在setManger中会调用"manager.setContext(this)" context.setManager(manager); } } //计算超时时间为分钟(注意:此处会将之前的1800秒,转换为30分钟)。可以看出最终的时间结果是个整数的分钟类型,也就是说如果设置的超时时间(单位为秒)不是60的倍数,也会最终转换为60的倍数,并且最小超时时间设置的是60秒。 private long getSessionTimeoutInMinutes() { long sessionTimeout = getSessionTimeout(); if (sessionTimeout > 0) { sessionTimeout = Math.max(TimeUnit.SECONDS.toMinutes(sessionTimeout), 1L); } return sessionTimeout; }
2의 세션 구성 매개변수를 설정하려면configureSession을 호출하세요. 마지막으로 MaxInactiveInterval에 SessionTimeout을 할당하세요. 드디어 세션 시간 초과 설정이 완료되었습니다.
//以下代码 @Override public void setContext(Context context) { //省略其余设置代码,直接重新设置Session超时时间,此时又将上面的分钟单位转为秒。此时终于给Sesseion设置了默认超时时间。 if (this.context != null) { setMaxInactiveInterval(this.context.getSessionTimeout() * 60); this.context.addPropertyChangeListener(this); } }
Three: 시간 초과를 맞춤 설정하면 어떻게 되나요?
사실 위의 과정을 보면 "org.springframework.boot.autoconfigure.web.ServerProperties" 클래스에서 해당 Session 매개변수만 찾아 초기화하고 놔두면 어렵지 않다는 것을 알 수 있다. 로드하면 설정이 완료됩니다.
/** * Get the session timeout. * @return the session timeout * @deprecated since 1.3.0 in favor of {@code session.timeout}. */ @Deprecated @DeprecatedConfigurationProperty(replacement = "server.session.timeout") public Integer getSessionTimeout() { return this.session.getTimeout(); }
그러므로 애플리케이션에서 "server.session.timeout"을 구성하면 됩니다. 매개변수 유형은 long 유형이고 단위는 "초"입니다.
4: 실행 중인 프로그램은 세션 시간 초과를 어떻게 결정하나요?
실제로는 매우 간단합니다. 매번 동일한 세션 요청 시간을 이전 요청 시간과 비교하여 두 값의 차이가 MaxInactiveInterval 값보다 크다는 것을 알아내기만 하면 됩니다.
//判断是否超时 @Override public boolean isValid() { //省略多个条件判断 if (maxInactiveInterval > 0) { //判断此session空闲时间是否比maxInactiveInterval大,如果大的情况下,session就超时 int timeIdle = (int) (getIdleTimeInternal() / 1000L); if (timeIdle >= maxInactiveInterval) { expire(true); } } return this.isValid; } //将上次访问时间和当前时间比较,拿到空闲时间值 @Override public long getIdleTimeInternal() { long timeNow = System.currentTimeMillis(); long timeIdle; if (LAST_ACCESS_AT_START) { timeIdle = timeNow - lastAccessedTime; } else { timeIdle = timeNow - thisAccessedTime; } return timeIdle; }
설명:
따라서 세션 시간 초과를 더 길게 유지하려면 애플리케이션 구성 파일에서 "server.session.timeout" 매개변수를 구성할 수 있습니다. 매개변수 단위는 "초"입니다. 60의 정수 배수가 아니라 60의 정수 배수로 변환됩니다(2: 시스템이 2단계의 "1"에서 시간 초과 및 알고리즘을 설정하는 방법 참조). 1분 미만일 경우 60초로 변환됩니다.
확장:
실제로 할당을 위해 EmbeddedServletContainerCustomizer의 사용자 정의 메서드를 직접 재정의할 수도 있습니다.
아아아아위 내용은 SpringBoot의 세션 시간 초과 문제의 원인에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











세션 실패는 일반적으로 세션 수명 만료 또는 서버 종료로 인해 발생합니다. 해결 방법은 다음과 같습니다. 1. 세션 수명을 연장합니다. 3. 쿠키를 사용합니다. 4. 세션 관리 미들웨어를 사용합니다.

PHPSession의 도메인 간 문제 해결 프런트엔드와 백엔드 분리 개발에서 도메인 간 요청이 표준이 되었습니다. 도메인 간 문제를 처리할 때 일반적으로 세션 사용 및 관리가 포함됩니다. 그러나 브라우저 원본 정책 제한으로 인해 기본적으로 도메인 간에 세션을 공유할 수 없습니다. 이 문제를 해결하려면 도메인 간 세션 공유를 달성하기 위한 몇 가지 기술과 방법을 사용해야 합니다. 1. 도메인 간 세션을 공유하기 위한 쿠키의 가장 일반적인 사용

SpringBoot와 SpringMVC는 모두 Java 개발에서 일반적으로 사용되는 프레임워크이지만 둘 사이에는 몇 가지 분명한 차이점이 있습니다. 이 기사에서는 이 두 프레임워크의 기능과 용도를 살펴보고 차이점을 비교할 것입니다. 먼저 SpringBoot에 대해 알아봅시다. SpringBoot는 Spring 프레임워크를 기반으로 하는 애플리케이션의 생성 및 배포를 단순화하기 위해 Pivotal 팀에서 개발되었습니다. 독립 실행형 실행 파일을 구축하는 빠르고 가벼운 방법을 제공합니다.

클러스터링 알고리즘에서 클러스터링 효과 평가 문제에는 특정 코드 예제가 필요합니다. 클러스터링은 데이터를 클러스터링하여 유사한 샘플을 하나의 범주로 그룹화하는 비지도 학습 방법입니다. 클러스터링 알고리즘에서는 클러스터링의 효과를 어떻게 평가하는가가 중요한 문제입니다. 이 기사에서는 일반적으로 사용되는 몇 가지 클러스터링 효과 평가 지표를 소개하고 해당 코드 예제를 제공합니다. 1. 클러스터링 효과 평가 지수 실루엣 계수 실루엣 계수는 표본의 근접성 및 다른 클러스터와의 분리 정도를 계산하여 클러스터링 효과를 평가합니다.

강력한 성능과 다재다능한 기능으로 잘 알려진 iPhone은 복잡한 전자 장치에서 흔히 발생하는 문제인 가끔씩 발생하는 문제나 기술적인 어려움으로부터 자유롭지 않습니다. iPhone 문제를 경험하면 실망스러울 수 있지만 일반적으로 알람은 필요하지 않습니다. 이 종합 가이드에서는 iPhone 사용과 관련하여 가장 일반적으로 직면하는 문제 중 일부를 쉽게 설명하는 것을 목표로 합니다. 당사의 단계별 접근 방식은 이러한 일반적인 문제를 해결하는 데 도움을 주고 장비를 최상의 작동 순서로 되돌릴 수 있는 실용적인 솔루션과 문제 해결 팁을 제공하도록 설계되었습니다. 결함이 있거나 더 복잡한 문제에 직면하더라도 이 문서는 문제를 효과적으로 해결하는 데 도움이 될 수 있습니다. 일반적인 문제 해결 팁 특정 문제 해결 단계를 진행하기 전에 다음은 몇 가지 유용한 정보입니다.

jQuery.val()을 사용할 수 없는 문제를 해결하려면 구체적인 코드 예제가 필요합니다. 프론트 엔드 개발자에게는 jQuery를 사용하는 것이 일반적인 작업 중 하나입니다. 그중에서도 .val() 메서드를 사용하여 양식 요소의 값을 가져오거나 설정하는 것은 매우 일반적인 작업입니다. 그러나 특정한 경우에는 .val() 메서드를 사용하지 못하는 문제가 발생할 수 있습니다. 이 문서에서는 몇 가지 일반적인 상황과 해결 방법을 소개하고 구체적인 코드 예제를 제공합니다. 문제 설명 jQuery를 사용하여 프런트 엔드 페이지를 개발할 때 때때로 다음과 같은 문제가 발생할 수 있습니다.

SpringBoot와 SpringMVC의 차이점은 무엇입니까? SpringBoot와 SpringMVC는 웹 애플리케이션 구축을 위한 매우 인기 있는 두 가지 Java 개발 프레임워크입니다. 별도로 사용되는 경우가 많지만 차이점은 분명합니다. 우선, SpringBoot는 Spring 프레임워크의 확장 또는 향상된 버전으로 간주될 수 있습니다. 개발자를 돕기 위해 Spring 애플리케이션의 초기화 및 구성 프로세스를 단순화하도록 설계되었습니다.

Yulong 8 Wine Master 시험과 관련된 질문은 무엇입니까? 이에 해당하는 대답은 무엇입니까? 시험에 빨리 합격하는 방법은 무엇입니까? Master of Wine 시험 활동에는 답변해야 할 질문이 많이 있으며, 답변을 참조하여 문제를 해결할 수 있습니다. 이 질문들은 모두 와인에 대한 지식과 관련이 있습니다. 참고가 필요하다면 Yakuza 8 Wine Master 시험 문제에 대한 답변의 자세한 분석을 살펴 보겠습니다! Rulong 8 Wine Master 시험 문제에 대한 자세한 설명 1. "와인"에 관한 질문. 하와이 왕족이 설립한 증류소에서 생산되는 증류주로, 하와이에서 대량으로 재배되는 사탕수수의 설탕을 원료로 만들어집니다. 이 와인의 이름은 무엇입니까? 답: 럼 2. "와인"에 관한 질문입니다. 사진은 건조 인삼과 건조 버무스로 만든 음료를 보여줍니다. 올리브를 첨가한 것이 특징이며 "코크니"로 알려져 있습니다.
