2014-12-08 1 views
0

그래서 spring-session 프로젝트를 사용하고 있는데 HttpSessionManager 빈을 autowire 할 수 있는지 알고 싶습니까? 난 당신이 SessionRepository와 함께 요청에서을 받고있는 users의 예에서 볼 수 그러나봄에 HttpSessionManager Bean을 자동 작성하는 방법은 무엇입니까?

HttpSessionManager sessionManager = 
      (HttpSessionManager) req.getAttribute(HttpSessionManager.class.getName()); 
    SessionRepository<Session> repo = 
      (SessionRepository<Session>) req.getAttribute(SessionRepository.class.getName()); 

, 나는 dB 층 근처에 서비스에서 액세스 할 내가 생각하지 않기 때문에 그것은이다 요구 사항을 서비스에 전달하는 좋은 설계 연습을 autowire하려고 시도했지만이 유형의 빈을 찾지 못했습니다. SessionRepository은 구성에 Bean을 정의했기 때문에 자동으로 잘 수 있습니다. 또한 RequestContextHolder을 사용하여 가져 오려고했지만 getSessionIds 메서드는 항상 빈 맵을 반환하므로 항상 새로운 세션을 만듭니다. 여기에 내 모든 방법입니다 :

@Override 
public Session getCurrentSession() { 

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); 

    HttpSessionManager sessionManager = 
     (HttpSessionManager) request.getAttribute(HttpSessionManager.class.getName()); 

    final Map<String, String> sessionIds = sessionManager.getSessionIds(request); 

    if (sessionIds != null) { 

     for (Map.Entry<String, String> e : sessionIds.entrySet()) { 
      final Session session = sessionRepository.getSession(e.getValue()); 
      if (session != null) { 
       return session; 
      } 
     } 
    } 

    Session session = sessionRepository.createSession(); 

    sessionRepository.save(session); 

    return session; 
} 

답변

0

내 생각은 RequestContextHolderHttpServletRequest 전에 SessionRepositoryFilter가 호출 캡처 것입니다. 이는 요청이 아직 랩핑되지 않았 음을 의미합니다.

기본적으로 EnableRedisHttpSession 구성은 CookieHttpSessionStrategy을 Bean으로 노출하지 않습니다. 이는 사용자가 SessionStrategy을 무시하고 이전 버전의 Spring (새로운 버전의 Spring 지원 @Conditional)을 지원할 수있게하는 데 필요합니다. 당신이 Bean으로 CookieHttpSessionStrategy을 노출하고 싶은 경우에, 당신은 구성에 다음을 추가 할 수 있습니다

@Bean 
public CookieHttpSessionStrategy sessionStragegy() { 
    return new CookieHttpSessionStrategy(); 
} 

일부 나 이후 버전을 노출 할 수 있습니다 그것에 대해 생각하면. 내가 주소를 gh-spring-session-75 만들었습니다.

+0

안녕하세요, Rob으로 세션 전략을 추가하려고 시도했지만 이제는 자동 배선 할 수 있지만 RequestStextHolder의 요청으로'sessionStrategy.getRequestedSessionId (request); '를 호출하면 항상 null이 반환됩니다. 'RequestContetHolder'가 쿠키를 전달하는지 잘 모르겠습니다 .... –

+0

안녕하세요, 쿠키가 전달됩니다. 첫 번째 요청은 일부 sessionID와 함께 제공되지만 서버가 다시 시작 되었기 때문에 리포지토리에 세션이 없으므로 리포지토리를 사용하여 새 세션을 만들게됩니다 (내 메서드의 마지막 세 줄을보십시오). 그러나이 새로운 세션은 쿠키에 저장되지 않으므로 다음 세션 쿠키 요청 ID는 동일하며 저장소는 다시 세션을 찾을 수 없으며 다른 세션을 만듭니다. 'CookieHttpSessionStrategy'에서 새로 생성 된 세션을 설정하는 방법을 알고 있습니까? –

관련 문제