我遇到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对象或实现新的自定义策略。
感谢您的帮助!
答案 0 :(得分:0)
您可能需要查看SessionRepositoryFilter
类的源代码,以了解会话管理器为空的原因。您将观察到它默认使用CookieHttpSessionStrategy
。 CookieHttpSessionStrategy
有一个wrapRequest
方法,用于在请求中设置sessionManager属性。
如果您向会话过滤器注入任何其他策略,则它使用MultiHttpSessionStrategyAdapter
静态类,该类不会设置SessionManager
。这就是你把它变为空的原因。
编辑:
您可以通过获取bean引用来获取会话管理器,如下所示:
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(httpRequest.getServletContext());
HttpSessionManager sessionManager = ctx.getBean(HttpSessionManager.class);
从本质上讲,您将获得在配置中定义的'httpSessionStrategy'bean的引用。