在Spring会话中使用HeaderHttpSessionStrategy Null HttpSessionManager

时间:2016-04-25 15:11:27

标签: java spring session spring-session

我遇到Spring会话的问题,允许在同一个浏览器中进行多个会话。我正在使用MapSessionRepository来存储会话和CookieHttpSessionStrategy。通过这种配置,一切正常。

我被要求将CookieHttpSessionStrategy更改为HeaderHttpSessionStrategy。现在,当我尝试从请求中获取HttpSessionManager时,我得到一个NullPointerException。

这是我之前的配置(我正在工作):

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

这是我的配置:

@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.HttpSessionManager属性。难道我做错了什么?我以为我可以改变我的策略,只需返回HeaderHttpSessionStrategy对象或实现新的自定义策略。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可能需要查看SessionRepositoryFilter类的源代码,以了解会话管理器为空的原因。您将观察到它默认使用CookieHttpSessionStrategyCookieHttpSessionStrategy有一个wrapRequest方法,用于在请求中设置sessionManager属性。

如果您向会话过滤器注入任何其他策略,则它使用MultiHttpSessionStrategyAdapter静态类,该类不会设置SessionManager。这就是你把它变为空的原因。

编辑:

您可以通过获取bean引用来获取会话管理器,如下所示:

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

从本质上讲,您将获得在配置中定义的'httpSessionStrategy'bean的引用。