2016-04-25 1 views
1

J'ai un problème avec la session de printemps pour permettre à plusieurs sessions dans un même navigateur. J'utilise MapSessionRepository pour stocker des sessions et CookieHttpSessionStrategy. Avec cette configuration, tout fonctionne bien.nul HttpSessionManager avec HeaderHttpSessionStrategy en session de printemps

On m'a demandé de changer CookieHttpSessionStrategy à HeaderHttpSessionStrategy. Maintenant, je reçois une exception NullPointerException lorsque j'essaie d'obtenir HttpSessionManager à partir de la requête.

C'est ma config précédente (I'ts travail):

@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(); 
    } 
} 

Ceci est mon nouvelle 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(); 
    } 
} 

je reçois l'objet SessionManager avec:

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

Lorsque j'utilise la stratégie d'en-tête, il n'y a pas org.springframework.session.web.http.HttpSe Attribut ssionManager sur demande. Est-ce que je fais quelque chose de mal? J'ai pensé que je pourrais changer ma stratégie en renvoyant simplement un objet HeaderHttpSessionStrategy ou en implémentant une nouvelle stratégie personnalisée.

Merci pour votre aide!

+0

Pourquoi êtes-vous même le 'l'obtention HttpSessionManager' comme ça? Si vous en avez besoin injectent juste ... –

Répondre

0

Vous devrez peut-être regarder le code source de SessionRepositoryFilter classe pour comprendre pourquoi le gestionnaire de session est nulle. Vous remarquerez qu'il utilise par défaut CookieHttpSessionStrategy. Le CookieHttpSessionStrategy présente une méthode wrapRequest qui définit l'attribut SessionManager à la demande.

Si vous injectez une autre stratégie au filtre de session, il utilise une classe statique MultiHttpSessionStrategyAdapter qui ne définit pas le SessionManager. C'est la raison pour laquelle vous obtenez ceci comme nul.

EDIT:

Vous pouvez obtenir la Session Manager en obtenant la référence de haricot comme ci-dessous:

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

Essentiellement, vous obtenez la référence du vous haricot « httpSessionStrategy » avait défini dans votre config.

+0

Il se trouve que la session de printemps ne prend pas en charge plusieurs sessions avec HeaderHttpSessionStrategy. J'ai utilisé HttpSessionStrategy à la place – josepul