2016-04-25 13 views
1

同じブラウザで複数のセッションを許可するためにspring-sessionに問題があります。私はセッションとCookieHttpSessionStrategyを格納するためにMapSessionRepositoryを使用しています。この構成では、すべてうまく動作します。null SpringセッションでHeaderHttpSessionStrategyを持つHttpSessionManager

CookieHttpSessionStrategyをHeaderHttpSessionStrategyに変更するよう依頼されました。リクエストからHttpSessionManagerを取得しようとすると、NullPointerExceptionが発生します。

これは、(作業I'ts)私の以前の設定です:

@Configuration 
@ComponentScan(basePackages = { "com.company.name" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = { "com.company.name.web*" })) 
@EnableScheduling 
@EnableAspectJAutoProxy 
@EnableCaching 
@EnableSpringHttpSession 
public class Config { 
    .... 
    .... 
    @Bean 
    public MapSessionRepository sessionRepository() { 
     return new MapSessionRepository(); 
    } 

    @Bean 
    public HttpSessionStrategy httpSessionStrategy() { 
     return new CookieHttpSessionStrategy(); 
    } 
} 

これは私の新しい configです:

@Configuration 
@ComponentScan(basePackages = { "com.company.name" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = { "com.company.name.web*" })) 
@EnableScheduling 
@EnableAspectJAutoProxy 
@EnableCaching 
@EnableSpringHttpSession 
public class Config { 
    .... 
    .... 
    @Bean 
    public MapSessionRepository sessionRepository() { 
     return new MapSessionRepository(); 
    } 

    @Bean 
    public HttpSessionStrategy httpSessionStrategy() { 
     return new HeaderHttpSessionStrategy(); 
    } 
} 

私はSessionManagerのオブジェクトを取得する:

//Se obtiene el manager de sesiones de spring session 
HttpSessionManager sessionManager = (HttpSessionManager) httpRequest.getAttribute(HttpSessionManager.class.getName()); 

ヘッダー戦略を使用すると、org.springframework.session.web.http.HttpSeはありません。要求に応じてssionManager属性。私は何か間違っているのですか?私はHeaderHttpSessionStrategyオブジェクトを返すか、新しいカスタム戦略を実装するだけで戦略を変えることができると考えました。

ありがとうございました!

+0

なぜあなたは 'HttpSessionManager'をそのように取得していますか?必要な場合は、それを挿入するだけです... –

答えて

0

セッションマネージャがnullである理由を理解するには、ソースコードSessionRepositoryFilterクラスを調べる必要があります。デフォルトではCookieHttpSessionStrategyが使用されていることがわかります。 CookieHttpSessionStrategyには、要求にsessionManager属性を設定するwrapRequestメソッドがあります。

他の戦略をセッションフィルタに注入すると、静的クラスが使用され、SessionManagerは設定されません。これがあなたをnullにしている理由です。

EDIT:あなたは以下のようにBean参照取得することにより、セッションマネージャを取得することができます

:本質的には

ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(httpRequest.getServletContext()); 
HttpSessionManager sessionManager = ctx.getBean(HttpSessionManager.class); 

を、あなたは自分の中で定義されていた「httpSessionStrategy」豆の参照を取得していますconfig。

+0

Spring SessionはHeaderHttpSessionStrategyで複数のセッションをサポートしていません。代わりにHttpSessionStrategyを使用しました – josepul

関連する問題