【发布时间】:2018-09-12 14:11:16
【问题描述】:
当尝试访问 GemFire 会话对象时,从自定义 Servlet 过滤器中,它会取而代之的是 Container 的会话对象。会话对象的类型:
org.apache.catalina.session.StandardSessionFacade@517957e2
但从Controller 开始,它工作正常。会话对象的类型为:
org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper$HttpSessionWrapper@5afe18ce
关于我们如何配置 GemFire:
我们有一个旧版零售应用程序。最重要的是,我们使用了 2.0.5 版本的 GemFire。在 webappintializer 启动时,
AnnotationConfigWebApplicationContext rootContext =
new AnnotationConfigWebApplicationContext();
rootContext.register(GemfireConfig.class,RootConfig.class, SecurityConfig.class);
由于springSessionRepositoryFilter bean 没有添加到过滤器链中,我们必须使用以下代码显式地向DelegatingFilterProxy 注册过滤器:
FilterRegistration.Dynamic springSessionRepositoryFilter =
container.addFilter("springSessionRepositoryFilter", DelegatingFilterProxy.class);
springSessionRepositoryFilter.addMappingForUrlPatterns(
EnumSet.allOf(DispatcherType.class), false, "/*");
在数据处理方面,为了获取会话对象,我们有一个 getSession 方法,它返回一个会话对象:
ServletRequestAttributes attr =
(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpSession session = attr.getRequest().getSession();
当我们从Controller 调用getSession() 方法时,它完全按照设计工作。但是从 Servlet 过滤器中调用它最终会得到容器创建的会话对象。
非常感谢任何帮助。
根据@John Blum 的评论重新设计,但仍然面临同样的问题。
【问题讨论】:
标签: java spring spring-session gemfire spring-data-gemfire