오늘 프로젝트에서 설정 시간 초과 문제가 발생했는데 SpringBoot2의 application.properties 변경 사항이 적용되지 않았습니다.
Spring Boot에서 사용하는 내장 컨테이너는 server.* 속성에 의해 제어됩니다. Spring Boot는 ServletWebServerFactory 인스턴스 중 하나를 사용하여 서블릿 컨테이너의 인스턴스를 생성합니다. 이러한 클래스는 server.* 속성을 사용하여 관리되는 서블릿 컨테이너(예: Tomcat, Jetty 등)를 구성합니다.
애플리케이션이 war 파일로 패키징되어 Tomcat 인스턴스에 배포되면 server.* 속성을 사용할 수 없습니다. 미리 만들어진 서블릿 컨테이너를 활용할 수 있으므로(서비스가 원격으로 실행되기 때문에) 이는 적용되지 않습니다. 따라서 원격 Tomcat에 배포하면 server.* 속성이 쓸모 없게 됩니다.
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와 같습니다.
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(); } }
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!