上篇文章完成之后,静态资源转发CDN的需求实现了,可惜的是,响应速度降低了,有种得不偿失的感觉。可不可以直接请求CDN呢?当然可以,方案是:web应用启动时,读取全局配置参数cdn_status,然后根据该值设置不同的域名变量,在引用静态资源的地方,使用脚本批量修改链接地址,修改后的链接地址中使用applicationScope获取域名值。

  1. 自定义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", "");
    }
}
  1. 参数配置

  在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>
  1. 批量修改静态资源引用链接值
<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编写的脚本实现批量替换。批量修改这里就不赘述了,八仙过海,各显神通!读者自己搞掂吧!

文章作者:admin
本文链接:http://javatech.wang/index.php/archives/26/
版本所有 ©转载时必须以链接形式注明作者和原始出处