목차
문제:
해결책:
1. 인터넷 게시글에 따라 구성 파일을 다음과 같이 변경합니다(Jar로 시작하면 적용됩니다).
2. tomcat의 세션 시간 초과를 설정합니다
시간이 동기화되지 않으면 Spring 세션 실패에 큰 함정이 발생합니다.
그리고 리눅스 서버 시간 동기화도 기록하겠습니다
Java java지도 시간 Springboot2 세션 시간 초과 설정이 잘못된 문제를 해결하는 방법

Springboot2 세션 시간 초과 설정이 잘못된 문제를 해결하는 방법

May 22, 2023 pm 01:49 PM
session springboot

문제:

오늘 프로젝트에서 설정 시간 초과 문제가 발생했는데 SpringBoot2의 application.properties 변경 사항이 적용되지 않았습니다.

해결책:

  • Spring Boot에서 사용하는 내장 컨테이너는 server.* 속성에 의해 제어됩니다. Spring Boot는 ServletWebServerFactory 인스턴스 중 하나를 사용하여 서블릿 컨테이너의 인스턴스를 생성합니다. 이러한 클래스는 server.* 속성을 사용하여 관리되는 서블릿 컨테이너(예: Tomcat, Jetty 등)를 구성합니다.

  • 애플리케이션이 war 파일로 패키징되어 Tomcat 인스턴스에 배포되면 server.* 속성을 사용할 수 없습니다. 미리 만들어진 서블릿 컨테이너를 활용할 수 있으므로(서비스가 원격으로 실행되기 때문에) 이는 적용되지 않습니다. 따라서 원격 Tomcat에 배포하면 server.* 속성이 쓸모 없게 됩니다.

1. 인터넷 게시글에 따라 구성 파일을 다음과 같이 변경합니다(Jar로 시작하면 적용됩니다).

server:
  servlet:
    session:
      timeout: PT1H        # 1小时过期
      cookie:
        max-age: PT1H      # 1小时过期
로그인 후 복사

참고: PT1H는 세션 만료 시간을 1시간으로 설정하는 것을 의미합니다. .

확장: Duration

springboot 소스 코드를 보면 setTimeouot 메소드를 확인할 수 있습니다. 여기서는 Duration의 인스턴스를 전달해야 합니다.

public void setTimeout(Duration timeout) {
       this.timeout = timeout;
    }
로그인 후 복사

Duration은 Java8에 새로 추가되었으며 주로 Duration을 계산하는 데 사용됩니다. 최종으로 선언되었으며 스레드로부터 안전합니다.

문자열을 변환하는 경우 SimpleDateFormat

Duration의 날짜 형식 지정 방법과 유사합니다. 문자열은 숫자와 유사하며 양수와 음수입니다. 기본값은 양수이고 음수는 '-'로 시작하고 그 뒤에 'PT'가 옵니다. ' 및 아래 시간 문자 :

  • 'D' - Days

  • 'H' - Hours

  • 'M' - Minutes

  • 'S' - Seconds

각 단위 숫자로 시작해야 하며 시, 분, 초의 순서는 뒤섞일 수 없습니다. 예: PT2H3M2S는 -PT-2H-3M-2S와 같습니다.

2. tomcat의 세션 시간 초과를 설정합니다

1) tomcat의 conf 디렉토리에서 servler.xml을 변경합니다:

<Context path="/abtest" docBase="/abtest"  
  defaultSessionTimeOut="3600" isWARExpanded="true"  
  isWARValidated="false" isInvokerEnabled="true"  
  isWorkDirPersistent="false"/>
로그인 후 복사

2) 프로젝트의 web.xml을 변경합니다:

<session-config>  
    <session-timeout>20</session-timeout>  
</session-config>
로그인 후 복사

3)

session.setMaxInactiveInterval(30*60);
로그인 후 복사

를 변경합니다. 프로그램 동일한 문제가 발생할 경우 위의 빨간색 글자를 읽어보시고 순서대로 문제를 해결하시기 바랍니다.

테스트 코드:

@RestController
@RequestMapping("/valid-time")
public class TestController { 
    @GetMapping("/test")
    public String validTime(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(); 
        int sessionTime = session.getMaxInactiveInterval(); 
        return new StringBuilder("sessionTime=").append(sessionTime).toString();
    }
}
로그인 후 복사

시간이 동기화되지 않으면 Spring 세션 실패에 큰 함정이 발생합니다.

Linux 서버 시간이 동기화되지 않으면 Spring 세션 실패에 큰 위험이 발생합니다.

비즈니스 요구로 인해 , 원래 독립형 환경을 클러스터 환경으로 변환했으며 작업을 수정하지 않기 위해 세션 공유 솔루션으로 spring session + redis를 선택했습니다.

기술적인 해결방안을 확인한 후, 인터넷에서 스프링 세션에 대한 많은 정보를 검색한 후 이전 사람들의 실수를 발견하지 못하고 작업을 시작했습니다.

redis 설치 프로세스는 무시됩니다.

정보에 따라 단계별로 스프링 세션을 프로젝트에 추가합니다. 단일 노드 프로젝트가 오류 없이 성공적으로 실행되었으며 세션이 Redis에 성공적으로 기록되었습니다.

그런 다음 안전을 위해 컴퓨터에 nginx를 설치하고 3개의 tomcat을 배포했는데 모든 것이 완벽해 보였고 여러 노드 간에 세션 공유가 완료되었습니다.

지금까지 모든 사전 준비가 완료되었고 이제 마지막 단계만 남았습니다.

악몽이 시작됩니다...

모든 노드를 온라인으로 배포한 다음 브라우저를 열어 애플리케이션에 성공적으로 액세스합니다. 물론 페이지가 완성되는 것을 보고만 멈출 수는 없으므로 어쨌든 로그인해야 합니다. ...

그럼...

사용자 비밀번호를 수없이 입력해서 로그인에 성공했다는 메시지가 떴으나 최종 결과는 여전히 거부되고 있었습니다. o(╥﹏╥)o

다음 단계는 수많은 여정입니다 구덩이 채우기

로그를 보니... ...

여러가지 요청사항을 보니...

스프링 세션에 버그가 있는 것 같네요...

리모컨도 켰습니다 DEBUG 모드 디버깅, 그리고 마지막으로 범용 DEBUG 모드에서 스프링 세션이 Session을 얻을 때 세션을 획득하면 우선 세션이 만료되었는지 여부를 판단한다는 것을 보았습니다. 비교 방법도 매우 간단합니다. 현재 시스템 시간을 가져와서 세션 만료 시간과 비교합니다. 현재 시간이 만료 시간보다 작으면 세션이 만료되지 않았음을 의미합니다. 이것을보고 즉시 깨달음을 느꼈고 마침내 여기에서 소우주가 터졌습니다.

니마—> 획득한 세션이 모두 만료되었고...그리고...물론 급하게 서버시간을 확인하러 달려가서...오(╥﹏╥)오, 알고보니 나를 속인 건 너였어...

이 피트트립을 기념하기 위해 이 글을 올립니다

그리고 리눅스 서버 시간 동기화도 기록하겠습니다

date 명령:

date: 현재 시간을 보면 결과는 다음과 같습니다: Tue Mar 4 01:36:45 CST 2017

date -s 09:38:40: 현재 시간을 설정하면 결과는 다음과 같습니다: Tue Mar 4 09:38: 40 CST 2017

NTPDATE 명령 :

ntpDate -U NTP : 네트워크 시간 동기화 명령

ntp 일반적으로 사용되는 서버 :

치 나트워크 서비스 센터 : 210.72.145. 44

NTP 서버 ( 상하이): ntp.api.bz

위 내용은 Springboot2 세션 시간 초과 설정이 잘못된 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

세션 실패를 해결하는 방법 세션 실패를 해결하는 방법 Oct 18, 2023 pm 05:19 PM

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

Redis를 사용하여 SpringBoot에서 분산 잠금을 구현하는 방법 Redis를 사용하여 SpringBoot에서 분산 잠금을 구현하는 방법 Jun 03, 2023 am 08:16 AM

1. Redis는 분산 잠금 원칙과 분산 잠금이 필요한 이유를 구현합니다. 분산 잠금에 대해 이야기하기 전에 분산 잠금이 필요한 이유를 설명해야 합니다. 분산 잠금의 반대는 독립형 잠금입니다. 다중 스레드 프로그램을 작성할 때 공유 변수를 동시에 작동하여 발생하는 데이터 문제를 방지하기 위해 일반적으로 잠금을 사용하여 공유 변수를 상호 제외합니다. 공유 변수의 사용 범위는 동일한 프로세스에 있습니다. 동시에 공유 리소스를 운영해야 하는 여러 프로세스가 있는 경우 어떻게 상호 배타적일 수 있습니까? 오늘날의 비즈니스 애플리케이션은 일반적으로 마이크로서비스 아키텍처입니다. 이는 하나의 애플리케이션이 여러 프로세스를 배포한다는 의미이기도 합니다. 여러 프로세스가 MySQL에서 동일한 레코드 행을 수정해야 하는 경우 잘못된 작업으로 인해 발생하는 더티 데이터를 방지하려면 배포가 필요합니다. 현재 소개할 스타일은 잠겨 있습니다. 포인트를 얻고 싶다

PHP 세션 교차 도메인 문제에 대한 솔루션 PHP 세션 교차 도메인 문제에 대한 솔루션 Oct 12, 2023 pm 03:00 PM

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

springboot가 파일을 jar 패키지로 읽은 후 파일에 액세스할 수 없는 문제를 해결하는 방법 springboot가 파일을 jar 패키지로 읽은 후 파일에 액세스할 수 없는 문제를 해결하는 방법 Jun 03, 2023 pm 04:38 PM

Springboot가 파일을 읽지만 jar 패키지로 패키징한 후 최신 개발에 액세스할 수 없습니다. springboot가 파일을 jar 패키지로 패키징한 후 파일을 읽을 수 없는 상황이 발생합니다. 그 이유는 패키징 후 파일의 가상 경로 때문입니다. 유효하지 않으며 읽기를 통해서만 액세스할 수 있습니다. 파일은 리소스 publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input 아래에 있습니다.

SpringBoot와 SpringMVC의 비교 및 ​​차이점 분석 SpringBoot와 SpringMVC의 비교 및 ​​차이점 분석 Dec 29, 2023 am 11:02 AM

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

SpringBoot가 Redis를 사용자 정의하여 캐시 직렬화를 구현하는 방법 SpringBoot가 Redis를 사용자 정의하여 캐시 직렬화를 구현하는 방법 Jun 03, 2023 am 11:32 AM

1. RedisAPI 기본 직렬화 메커니즘인 RedisTemplate1.1을 사용자 정의합니다. API 기반 Redis 캐시 구현은 데이터 캐싱 작업에 RedisTemplate 템플릿을 사용합니다. 여기서 RedisTemplate 클래스를 열고 클래스의 소스 코드 정보를 봅니다. 키 선언, 값의 다양한 직렬화 방법, 초기 값은 비어 있음 @NullableprivateRedisSe

springboot에서 application.yml의 값을 얻는 방법 springboot에서 application.yml의 값을 얻는 방법 Jun 03, 2023 pm 06:43 PM

프로젝트에서는 일부 구성 정보가 필요한 경우가 많습니다. 이 정보는 테스트 환경과 프로덕션 환경에서 구성이 다를 수 있으며 실제 비즈니스 상황에 따라 나중에 수정해야 할 수도 있습니다. 이러한 구성은 코드에 하드 코딩할 수 없습니다. 예를 들어 이 정보를 application.yml 파일에 작성할 수 있습니다. 그렇다면 코드에서 이 주소를 어떻게 얻거나 사용합니까? 2가지 방법이 있습니다. 방법 1: @Value 주석이 달린 ${key}를 통해 구성 파일(application.yml)의 키에 해당하는 값을 가져올 수 있습니다. 이 방법은 마이크로서비스가 상대적으로 적은 상황에 적합합니다. 프로젝트, 업무가 복잡할 때는 논리

Redis 공유 세션 애플리케이션에서 SMS 로그인을 구현하는 방법 Redis 공유 세션 애플리케이션에서 SMS 로그인을 구현하는 방법 Jun 03, 2023 pm 03:11 PM

1. 세션 기반 SMS 로그인 구현 1.1 SMS 로그인 흐름도 1.2 SMS 인증코드 전송 구현 프런트엔드 요청 설명: 요청 방법 설명 POST 요청 경로/사용자/코드 요청 매개변수 전화(전화번호) 반환 값 백엔드 인터페이스 없음 구현: @Slf4j@ ServicepublicclassUserServiceImplextendsServiceImplimplementsIUserService{@OverridepublicResultsendCode(Stringphone,HttpSessionsession){//1인 경우 휴대폰 번호를 확인합니다.

See all articles