shiro session 은 만 료 시간 이 작용 하지 않 고 유효 하지 않 음 을 설정 합 니 다.

4871 단어 shiroehcache
배경 지식
본 고 는 주로 shiro 설정 session 만 료 시간 이 유효 하지 않 은 문 제 를 다 루 지만 shiro 의 session 은 session manager 가 관리 하기 때문에 session manager 를 소개 할 필요 가 있 습 니 다. 이렇게 하면 이해 에 도움 이 됩 니 다.shiro 에서 자주 사용 하 는 session manager 는 ServletContainerSessionManager, DefaultWebSessionManager 가 있다.
  • servlet container session 이 ServletContainerSessionManager 로 설정 되 었 을 때 session 의 조작 은 servlet 용기 (tomcat, Jetty) 가 책임 집 니 다. 쉽게 말 하면 shiro 는 브리지 역할 만 합 니 다. 이때 session 이 만 료 되 는 시간 은 웹. xml 의 session timeout 에서 지정 합 니 다.
    
      
      30
    
    
  • native session 이 DefaultWebSessionManager 로 설정 되 었 을 때 session 은 native session, 즉 로 컬 session 으로 shiro 관리 session (생 성, 업데이트, 소각) 으로 servlet 용기 와 관계 가 없습니다.이 경우 세 션 의 만 료 시간 은 shiro 프로필 에서 지정 합 니 다.

  • bug 재현
    보통 저 희 는 shiro 를 선택 하여 session 을 관리 합 니 다. shiro 설정 은 다음 과 같 습 니 다.
    
    	
    		
    		
    	
    	
    		
    		
    	
      
      
    

    여기 서 만 료 시간 은 1800000 밀리초 = 30 분 * 60 초 * 1000 밀리초, 즉 30 분 으로 지정 된다.EnterpriseCacheSessionDAO 의 부모 클래스 CachingSessionDAO 는 캐 시 session 의 캐 시 블록 이름 을 정의 합 니 다.
    public abstract class CachingSessionDAO extends AbstractSessionDAO implements CacheManagerAware {
    
        /**
         * The default active sessions cache name, equal to {@code shiro-activeSessionCache}.
         */
        public static final String ACTIVE_SESSION_CACHE_NAME = "shiro-activeSessionCache";
        }
    

    그래서 ehcache 는 보통 shiro-activeSessionCache 블록 이 있 습 니 다. 설정 은 다음 과 같 습 니 다.
    
    

    이렇게 설정 하 는 데 두 가지 오류 가 있 습 니 다.
  • timeToIdle Seconds 는 2 분 으로 설정 되 어 있 으 며, 2 분 안에 대화 가 없 으 면 session 은 ehcache 에서 삭 제 됩 니 다
  • 메모리 제한 으로 인해 session 이 너무 많 으 면 디스크 에 기록 되 어야 하지만 overflow ToDisk = false 는 디스크 에 쓸 수 없고 삭 제 됩 니 다
  • 상기 두 가지 오 류 는 모두 ehcache 의 자기 주장 으로 인해 session 이 기한 이 지나 지 않 아 삭제 되 었 고 session 스케줄 러 에 알 리 지 않 았 습 니 다.올 바른 방법 은 session 스케줄 러 만 삭제 할 수 있 습 니 다. ehcache 는 스스로 삭제 할 수 없습니다. 이 는 ehcache 에서 session 의 여가 시간 이 영구적 이 고 메모리 가 부족 하면 디스크 에 기록 해 야 합 니 다. jvm session 을 다시 시작 하 라 고 요구 하면 diskPersistent = true 가 필요 합 니 다.참고 로 세 션 스케줄 러 는 기본적으로 1 시간 간격 으로 실 행 됩 니 다.올 바른 설정 은
    
    eternal="true"  
    timeToIdleSeconds="0" 
    timeToLiveSeconds="0" 
    overflowToDisk="true" 
    diskPersistent="true" 
    />
    

    사실 shiro - ehcache. jar 에 ehcache. xml (자바 에 대응 하 는 net. sf. ehcache. config. cache Configuration) 이 있 는데 그 안에 있 는 주석 도 이 문 제 를 명확 하 게 설명 했다.
     
        
    

    총결산
  • session 만 료 시간 을 설정 하 는 것 은 ehcache 가 자체 적 으로 삭제 하기 때 문 입 니 다.
  • redis / ehcache 와 session 의 운영 체 제 를 이해 했다.캐 시 는 session 만 저장 하고 스스로 삭제 할 수 없습니다. session 스케줄 러 는 check session 의 유효성 을 책임 집 니 다. 기한 이 지나 면 redis / ehcache 에 session 을 삭제 하 라 고 명확 하 게 지시 합 니 다.

  • 레 퍼 런 스
    shiro session management

    좋은 웹페이지 즐겨찾기