l 需求
网站中用session存放了一些实体,但是这些实体一直存放在session中会造成内存被长期的占用,在session中存放的实体只在有效的范围之内被使用。所以session必须要通过一个独立与其他程序的一个模块来管理session中的实体,第一减少程序员考虑什么时机把什么样的实体从session中remove掉;其次remove sessiion实体的动作集中在一处;最后容易扩展。
l 分析
Session中的实体分为一下几种情况:
a. 各个实体之间没有任何关系。
b. 各个实体之间之间有单向依赖的关系。
c. 各个实体之间有双向依赖的关系。
此系统是基于B/S结构的系统,所以用户要进入系统是通过不同的url来让系统执行不同的动作,但是url在整个系统中是唯一的,其中一个或几个 url构成一个useCase,一个useCase可以有零个或一个或多个实体存放到session中,其中useCase在整个项目中是唯一的。
由于session中的实体之间的关系可以推导出useCase之间的关系:
a. 各个useCase之间没有任何关系。
b. 各个useCase之间有单向依赖关系。
c. 各个useCase之间有双向依赖关系。
l 设计
从上面的分析可以发现这样的规律:url和useCase之间是一对一的关系,useCase和session里面的实体是一对多的关系。要表达url、usecase、session里面的实体之间的关系,只能通过Map结构来实现。Session管理模块比对当前url对应的usecase是否和前一次url对应的usecase相同,如果不同则去执行session管理的逻辑,如果相同则不执行session管理的逻辑。
到底那些url归结成一个usecase?其中每一个usecase中到底需要那些session中的那些实体?usecase与usecase之间的关系如何?
要回答以上几个问题没有人比开发该项目的程序员更了解,所以url、usecase、session中的实体之间的关系需要程序员来完成但是要用这个模块必须遵循这个模块本人的一些规则,这个是无法避免的。
从以上的叙述我们可以发现:划分usecase是十分重要的事情,能让session管理模块是否发挥出自己最大的威力直接依赖与对usecase的划分是否恰当。
Session管理模块对程序员发出警告如果你不遵守session模块制定的对usecase划分时的规则以及有关sessionAttribute命名规则和什么样的usecase放入什么样的sessionAttribute规则,出了问题你自己负责人。
Session管理模块制定一下对usecase划分的规则:
1.默认的useCase是局部useCase. 2.可以同过在useCase前加GloabalUseCase/来设置useCase为全局usecase. (如果lastUseCase是GloabalUseCase的不用去执行remove session中实体的逻辑,因为GloabalUseCase被session管理模块定义为此usecase中没有session atrribute或此usecase中的session不能被remove掉)。 3.如果一个useCase中的sessionAttribute有一部分是依赖与另一个useCase中的sessionAttribute,则被依赖的useCase是依赖的useCase的伪父useCase.依赖usecase的格式是:parentUseCase/currentUseCase或*parentUseCase/currentUseCase。 4.被依赖的usecase即是放入一个实体到session中,依赖的usecase则是用到被依赖的usecase放入session中的实体。 |
sessionAttribute命名规则:
如果两个useCase共用一个session中的实体并且这个实体是依赖的实体使用完后它在别的地方没有别使用到,但每次只要是被依赖的usecase执行时都会把此实体放入session,因此session管理模块把这样的实体在session中的attribute加上前缀“Temp_”。 |
Usecae中放入sessionAttribute的规则:
在这个usecase中所用到的所有sessionAttribute,放入到此usecase中。用到的sessionAttribute包括两个方面第一,自己所需要的sessionAttribute;第二,自己增加的sessionAttribute. |
l 实现
用aop的方式实现session管理,Interceptor是spring mvc中的aop方式,它主要提供两个方法即:preHandle()在执行web层的方法之前进行拦截,postHandle()在web层方式执行完后返回相关view时执行的方法。
Session管理的逻辑由专门的一个SessionManager来管理,它的职责是管理session中的实体,在恰当的时候把有关session中的实体remove掉。客户端可以通过spring的依赖注入把url对应的usecase放到SessionManager中的urlTouseCaseMap其中key是url而value值是usecase;客户端再次通过依赖注入把useCase对应的session attribute注入到useCaseToattributeMap,其中key值是useCase而value值是多个session attribute。