avi*_*mar 2 spring-data-gemfire spring-session
“会话”范围 bean 可以与Spring Session和 Pivotal GemFire 一起使用吗?
当将Spring Session用于“会话”范围 bean 时,Spring会HttpSession为此 bean创建一个额外的。这是一个存在的问题吗?
解决这个问题的方法是什么?
Joh*_*lum 10
关于...
会话范围的 bean 可以与 Spring Session 和 GemFire 一起使用吗?
是的!
事实上,Spring Session使用哪个底层“提供者”也无关紧要。例如,无论是春季会议用的GemFire /的Geode(文档)或春季会议与Redis的(文档)等,可以使用和它的作用是相同的(以同样的方式)。
至于...
如果将 Spring Session 用于会话作用域 bean Spring 会为此 bean 创建额外的 HttpSession,这是一个存在的问题吗?
嗯,这不完全正确。
您必须了解此处使用的底层技术以及它们如何协同工作,包括Spring Session、Spring 框架、Servlet 框架、您的Web 容器(例如 Tomcat),它们受 Java EE Servlet规范中指定的契约约束,以及您可能已应用的任何其他技术(例如Spring Security 的Web 支持)。
如果我们深入研究Spring 的体系结构/基础设施,您将开始了解它是如何工作的,它为什么工作以及为什么您的特定语句(“ Spring为这个 bean创建了一个额外的HttpSession ”)是不正确的。
首先,Spring Session注册了一个非常重要的Servlet Filter,o.s.session.web.http.SessionRepositoryFilter.
有许多不同的方法可以做到这一点,Javadoc forjavax.servlet.Filter基本上暗示这是通过 Web 应用程序“部署描述符”完成的。
当然,考虑到我们今天的配置选项,Web 应用程序部署描述符的定义相当松散,但我们通常知道这意味着web.xml. 然而,这并不是我们可以配置 Web 应用程序的ServletContext.
Spring支持web.xml基于部署描述符以及使用Servlet (3.0+) API 的JavaConfig。
在web.xml您将注册(例如)Spring Frameworks' 时 o.s.web.filter.DelegatingFilterProxy,它委托给实际的javax.servlet.Filter实现(当Spring Session正在运行时,这o.s.session.web.http.SessionRepositoryFilter当然是 ),它也被声明/定义为“ bean ”(首先是这个,然后this ) 在Spring容器中。这是必要的,以便自动连接(注入)适当的Spring Session o.s.session.SessionRepository实现(也是在容器中定义的Spring托管 bean,例如用于Redis),它知道如何将 (HTTP)Session状态管理委托给底层“提供者”。
在JavaConfig方法中,注册是通过核心Spring Framework 的 o.s.web.WebApplicationInitializer概念来执行的。阅读 Javadoc 以获取更多详细信息。
那么,Spring Session提供了这样一个WebApplicationInitializer初始化(HTTP)Session 管理,o.s.session.web.context.AbstractHttpSessionApplicationInitializer. 通常,当使用Spring 的 基于 Java 的容器配置和/或注解配置方法时,开发人员将创建一个类来扩展这个Spring Session提供的类,并为底层 Session 管理提供者注册必要的配置(例如连接标准);为例如(也参见此)。本Config类注释与@EnableRedisHttpSession该进口的春天 @Configuration声明类/定义适当的 Servlet需要SessionRepository的“提供者”(例如再次Redis)的Spring Session实现(再次)。 FilterSessionRepositoryFilter
如果你在看什么春季会议 AbstractHttpSessionApplicationInitializer呢,你会看到它注册的春季会议,SessionRepositoryFilter间接通过Spring框架的 DelegatingFilterProxy...从插入,然后在这里,那么这里终于,在这里。
如您所见,Spring Session SessionRepositoryFilter位于Servlet链中的第一个位置。由于 in 中的参数是“ isMatchAfter ”,因此被否定。 Filters!insertBeforeOtherFiltersjavax.servlet.FilterRegistration.Dynamic.addMappingForUrlPatterns(dispatcherTypes, isMatchAfter, urlPatterns...)
这是必不可少的,因为Spring Session o.s.session.web.http.SessionRepositoryFilter 取代了javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse。具体来说,通过更换javax.servlet.http.HttpServletRequest,春季会议能提供的实现javax.servlet.http.HttpSession(当HttpServletRequest.getSession(..)被调用)由支持春季会议和开发者的选择(例如Redis的,的GemFire)的整个目的的提供商春季会议在首位。
因此,Servlet Filters在任何框架代码(例如Spring Framework 的会话范围 bean 基础结构)之前看到 HTTP 请求/响应,尤其是在任何 Web 应用程序的Controllers或之前Servlets看到 HTTP 请求/响应。
因此,当核心Spring Framework 的会话作用域 bean 基础结构看到 (HTTP) Servlet请求/响应时,它会看到Spring Session传递给它的内容,这只是Spring Session支持的常规javax.servlet接口(例如HttpSession)的实现。
查看核心Spring Framework 的 o.s.web.context.request.SessionScope“自定义”实现(它处理在Spring容器中声明/定义的会话范围 bean 的 bean 引用/bean 生命周期),它扩展了o.s.web.context.request.AbstractRequestAttributesScope,您会看到它只是委托给o.s.web.context.request.SessionRequestAttributes类。此类主要由Spring 创建DispatcherServlet,并setAttribute(name, value, scope)根据相关 bean(定义)定义的“提供”范围定义其所有操作(例如)。有关更多详细信息,请参阅来源。因此 bean 被添加到适当的 HTTP 会话中。
当然,Spring “将” javax.servlet.http.HttpSession在第一个 HTTP 请求上创建一个新的请求,但Spring Session 的基础设施并不知道它,因为Spring在这种情况下使用的是Spring Session 的“ ”javax.servlet.http.HttpSession支持的实现。Session
此外,getSession(true)也只是一个指示,如果它不存在,HttpSession则“允许”创建它!一个Servlet的容器,根本不守创建每个HTTP请求新的HTTP会话,只要可以从HTTP请求(这是通过URL或者做注射...确定会话IDjsessionid或用一个cookie,通常情况下)。有关javax.servlet.HttpServletRequest.getSession(boolean)更多详细信息,请参阅。
无论如何,对整个故事唯一的其他警告是,您需要确保,尤其是对于 GemFire,...
容器中定义的Spring “会话”作用域 bean 是可序列化的,可以使用 Java 序列化或GemFire 的序列化策略之一。这包括任何 bean 引用(其他 bean、对象类型等),除非声明了这些“引用” transient。注意:我并不完全确定基于 GemFire 反射的 PDX 序列化方法完全“知道”“瞬态”字段。意识到这一点。
您必须确保会话中序列化的类位于 GemFire Servers 类路径上。
我目前正在研究Spring Session Data Geode/GemFire的配置选项以支持 PDX,但目前尚不可用。
无论如何,我希望这有助于清理浑水。我知道要消化很多东西,但一切都应该按照用户的期望工作。
我还要补充一点,我也没有测试过。但是,在查看代码后,我非常确定这应该可行。
在不久的将来,我已将添加测试和示例以涵盖这种情况作为一项任务。
干杯! -约翰
| 归档时间: |
|
| 查看次数: |
1373 次 |
| 最近记录: |