servlet规范从2.3起引入了servletrequestwrapper包装类,它把调用交给被包装的servletrequest来执行。这样就可以对servletrequest进行扩展。例如tomcat就是将自己的request类作为包装类的实体。
为了更好的支持httpservletrequest,servlet2.3还支持了提供了httpservletrequestwrapper,其实现了接口httpservletrequest,并且继承了servletrequestwrapper。

sessionrepositoryrequestwrapper继承了httpservletwrapper,并覆盖了getsession方法,通过spring自己的策略生成session。此外提供了commitsession方法来进行session提交时处理,下一章会专门讲session生命周期。
1. spring定义了新的response wrapper–oncommittedresponsewrapper,其关联了自实现的字符和字节输出流,并定义了一个模板方法onresponsecommitted,由继承子类来实现。
2. oncommittedresponsewrapper关联了自己实现的一个字节流和字符流。他们和普通的字节字符流一样也是个包装类。
spring-session通过filter将自定义的request wrapper和response wrapper侵入到servlet容器中。
在tomcat中servlet的service方法会由applicationfilterchain调用,而filterchain的参数通过filter的filterchain.dofilter传入。spring-session通过自定义的全局拦截器sessionrepositoryfilter(详见第一篇)将request和response侵入进容器。
sessionrepositoryfilter继承了onceperrequestfilter,父类的dofilter最终会将具体的处理逻辑交给子类处理。
onceperrequestfilter是用来保证一次完整的拦截链中,同一个类只会被调用一次。
因为spring无法保证同一个filter类只有一个实例。有可能一个filter既有可能在web.xml里配置由容器初始化了,还有可能被作为spring的依赖引入进了delegatingfilterproxy。这样在一次filter chain中就会存在同一个filter的多个实例。