一、需求背景
为了让访客更快速的访问系统的相关信息,达到信息即点既显示的效果,遂决定针对系统的部分页面进行静态化!
二、技术方案
鉴于上述需求背景,经讨论采用页面静态化方案,即将频繁请求的页面做成静态的html页面,在客户访问的时候,直接跳转到静态的html来提高访问效率。
三、静态化的技术原理
一般的模式是:客户端请求→服务器响应→反馈给浏览器解析呈现内容给客户浏览器。
为了方便大批量页面的静态化处理并且要求尽少量的改动代码,所以我们的方案是截取客户第一次访问服务器后响应内容,产生静态文件并存放起来,当下一个客户再次请求相关内容时 ,判断客户请求是否已经产生了静态页面,如果是,则直接返回静态页面,如果没有,则服务端响应请求并产生静态页面。流程图如下:
四、技术实现
1).配置需要静态化的页面
- 解释:将需要静态化的页面配置在配置文件中,方便统一管理静态化的需求信息。
- 配置文件:staticize.properties
- 配置规则:
- Key:/命名空间/action名称/执行的方法名称
- Value: 执行的方法所返回的字符串
Eg:/app/ebBookHome/ebBookHome=success; |
2).staticizInterceptor进行全局拦截
2.1.判断当前访问用户是否已经登录,因为静态化目前只针对非登录用户
2.2.判断在属性配置文件中(staticize.properties)是否配置了当前请求的路径是否需要静态化
2.3.根据规则获得存放相应静态文件的目录
目录规则:语言环境/命名空间/ action名称/执行的方法名称/以跳转的目标jsp的文件,名称为“名称/”。
2.4.根据规则获得静态文件的名称
名称规则:
若请求路径没有参数,则以跳转的目标jsp的不带格式的名称为名称,Eg:若请求路径 http://ebook.ruanko.com/app/ebBookHome!ebBookHome.action,可以看出此链接没有带参数,从配置信息中发现跳转的目标jsp为home.jsp,则静态文件名称为home.html。
若请求路径带参数,则根据如下规则产生名称,参数名称1=参数值1&参数名称2=参数值2&参数名称3=参数值3……依此类推。
Eg:若请求路径是http://ebook.ruanko.com/app/ebookAction!booksList.action?ebCode.id=19b0f690e0b0413f8c047f9731ce25c9&pageModel.page=1,可以看出此链接有参数,根据规则,则静态文件名称为:ebCode.id=19b0f690e0b0413f8c047f9731ce25c9&pageModel.page=1.html
2.5 判断目录中是否存在静态文件
若存在,则跳转到对应的静态文件,若不存在,这执行默认的action方法,并生成静态文件。
3).WrapperResponse对response的封装,用来获得服务器响应内容,并将内容写到静态文件。
技术实现对应的流程图如下:
五、静态化效果
当某一路径第一次请求时,服务器会与数据库交互,需要消耗一定的时间,当此路径被请求一次之后,所有此路径的请求将直接跳转到静态页面,速度明显提升。
六、适用场景
对于不常更新,交互很少的页面可以采用此静态化方案。若需要保证数据相对的及时性,可以定时产生静态页面,比如每一个小时产生一次。
七、更新策略
现阶段采用的是:每天晚上23点59分0秒将所有的静态页面全部删除,待下次访问时全部重新生成。
预留方案:为了更加及时显示更新信息,在页面相关内容更新时,可以采用aop技术将所有的更新方法进行切面拦截,将符合要求(因为没必要在所有的更新操作之后都进行静态文件的更新,所以我们可以在通知中进行更新方法的筛选,满足要求的更新操作才进行通知操作)的更新操作方法发出删除静态页面的通知。