上篇文章完成之后,静态资源转发CDN的需求实现了,可惜的是,响应速度降低了,有种得不偿失的感觉。可不可以直接请求CDN呢?当然可以,方案是:web应用启动时,读取全局配置参数cdn_status,然后根据该值设置不同的域名变量,在引用静态资源的地方,使用脚本批量修改链接地址,修改后的链接地址中使用applicationScope获取域名值。
- 自定义ServletContext监听器
自定义ServletContext监听器只要实现ServletContextListener接口即可,该监听器主要用来读取和设置转发CDN的相关参数。代码如下:
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
initContextParam(servletContextEvent);
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
}
private void initContextParam(ServletContextEvent event) {
ServletContext context = event.getServletContext();
String cdn_status = context.getInitParameter("cdn_status");
//如果cdn_status等于1,则表示开启cdn,则设置对应的cdn资源链接域名,域名可以在web.xml中配置
if("1".equals(cdn_status)) {
context.setAttribute("cdn_script_link", context.getInitParameter("cdn_script_link"));
context.setAttribute("cdn_css_link", context.getInitParameter("cdn_css_link"));
context.setAttribute("cdn_image_link", context.getInitParameter("cdn_image_link"));
} else {
context.setAttribute("cdn_script_link", "");
context.setAttribute("cdn_css_link", "");
context.setAttribute("cdn_image_link", "");
}
}
- 参数配置
在web.xml中使用<context-param>
元素进行配置,配置内容如下:
<context-param>
<param-name>cdn_status</param-name>
<param-value>1</param-value>
</context-param>
<context-param>
<param-name>cdn_css_link</param-name>
<param-value>//css.static.aa.com</param-value>
</context-param>
<context-param>
<param-name>cdn_script_link</param-name>
<param-value>//js.static.aa.com</param-value>
</context-param>
<context-param>
<param-name>cdn_image_link</param-name>
<param-value>//image.static.aa.com</param-value>
</context-param>
- 批量修改静态资源引用链接值
<link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath}/css/login-new.css?v=${systemVersion}" />
<script type="text/javascript" src="${pageContext.request.contextPath}/js/common/jquery-1.9.1.js?v=${systemVersion}"></script>
修改为:
<link type="text/css" rel="stylesheet" href="${applicationScope.cdn_css_link}${pageContext.request.contextPath}/css/login-new.css?v=${systemVersion}" />
<script type="text/javascript" src="${applicationScope.cdn_script_link}${pageContext.request.contextPath}/js/common/jquery-1.9.1.js?v=${systemVersion}"></script>
有可能资源的引用比较分散,需要修改的地方非常多,手动修改效率不高,需要批量修改。笔者采用python编写的脚本实现批量替换。批量修改这里就不赘述了,八仙过海,各显神通!读者自己搞掂吧!