`
foxxiao
  • 浏览: 107261 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何在只使用tomcat的情况下,自动缓存js和css或者image等文件

阅读更多
该方法分为以下3个步骤
第一步:写一个filter,可以根据路径的正则来判断该路径的请求是否需要设置max-age:
Java代码
/**
*
* @author ahuaxuan
* @date 2008-12-4
* @version $id$
*/  
public class CacheFilter implements Filter{   
  
    private static transient Log logger = LogFactory.getLog(CacheFilter.class);   
       
    private Integer cacheTime = 3600 * 24;   
    private List<Pattern> patternList = new ArrayList<Pattern>();   
       
    private static ResourceBundle rb = ResourceBundle.getBundle("cache-pattern");   
    public void destroy() {   
           
     }   
  
    public void doFilter(ServletRequest rq, ServletResponse rqs,   
             FilterChain fc) throws IOException, ServletException {   
           
         fc.doFilter(rq, rqs);   
        if (rq instanceof HttpServletRequest && rqs instanceof HttpServletResponse) {   
             HttpServletRequest request = (HttpServletRequest) rq;   
             HttpServletResponse response = (HttpServletResponse) rqs;   
               
            if (matchPattern(request.getRequestURI())) {   
                 response.setHeader("Cache-Control", "max-age=" + cacheTime);   
                if (logger.isDebugEnabled()) {   
                     StringBuilder sb = new StringBuilder();   
                     sb.append(" set cache control for uri = ").append
(request.getRequestURI());   
                     sb.append(" and the cache time is ").append(cacheTime).append("

second");   
                     logger.debug(sb.toString());   
                 }   
             }   
           
         } else {   
            if (logger.isWarnEnabled()) {   
                 logger.warn("---- the request instance is not instanceof

HttpServletRequest ---");   
                 logger.warn("---- the response instance is not instanceof

HttpServletResponse ---");   
             }   
         }   
           
     }   
  
    public void init(FilterConfig arg0) throws ServletException {   
         Enumeration<String> keys = rb.getKeys();   
        while (keys.hasMoreElements()) {   
             String p = keys.nextElement();   
             String value = rb.getString(p);   
             patternList.add(Pattern.compile(value, Pattern.CASE_INSENSITIVE));   
               
            if (logger.isInfoEnabled()) {   
                 logger.info(">>>>>>>>>>> init the cache pattern " + value);   
             }   
         }   
           
        if (arg0 != null) {   
             String ct = arg0.getInitParameter("cache-time");   
            if (!"".equals(ct) && null != ct) {   
                 cacheTime = new Integer(ct);   
                if (logger.isInfoEnabled()) {   
                     logger.info(">>>>>>>>>> the cache time is " + cacheTime);   
                 }   
             }   
         }   
     }   
       
    private boolean matchPattern(String url) {   
        for (Pattern pattern : patternList) {   
            if (pattern.matcher(url).matches()) {   
                return true;   
             }   
         }   
           
        return false;   
     }   
  
    public static void main(String [] args) throws ServletException {   
         CacheFilter cf = new CacheFilter();   
         cf.init(null);   
         System.out.println(cf.matchPattern("/css/prototype.CSS"));   
     }   


/**
*
* @author ahuaxuan
* @date 2008-12-4
* @version $id$
*/
public class CacheFilter implements Filter{

private static transient Log logger = LogFactory.getLog(CacheFilter.class);

private Integer cacheTime = 3600 * 24;
private List<Pattern> patternList = new ArrayList<Pattern>();

private static ResourceBundle rb = ResourceBundle.getBundle("cache-pattern");
public void destroy() {

}

public void doFilter(ServletRequest rq, ServletResponse rqs,
   FilterChain fc) throws IOException, ServletException {

fc.doFilter(rq, rqs);
if (rq instanceof HttpServletRequest && rqs instanceof HttpServletResponse) {
   HttpServletRequest request = (HttpServletRequest) rq;
   HttpServletResponse response = (HttpServletResponse) rqs;
  
   if (matchPattern(request.getRequestURI())) {
    response.setHeader("Cache-Control", "max-age=" + cacheTime);
    if (logger.isDebugEnabled()) {
     StringBuilder sb = new StringBuilder();
     sb.append(" set cache control for uri = ").append(request.getRequestURI());
     sb.append(" and the cache time is ").append(cacheTime).append(" second");
     logger.debug(sb.toString());
    }
   }

} else {
   if (logger.isWarnEnabled()) {
    logger.warn("---- the request instance is not instanceof HttpServletRequest ---");
    logger.warn("---- the response instance is not instanceof HttpServletResponse ---");
   }
}

}

public void init(FilterConfig arg0) throws ServletException {
Enumeration<String> keys = rb.getKeys();
while (keys.hasMoreElements()) {
   String p = keys.nextElement();
   String value = rb.getString(p);
   patternList.add(Pattern.compile(value, Pattern.CASE_INSENSITIVE));
  
   if (logger.isInfoEnabled()) {
    logger.info(">>>>>>>>>>> init the cache pattern " + value);
   }
}

if (arg0 != null) {
   String ct = arg0.getInitParameter("cache-time");
   if (!"".equals(ct) && null != ct) {
    cacheTime = new Integer(ct);
    if (logger.isInfoEnabled()) {
     logger.info(">>>>>>>>>> the cache time is " + cacheTime);
    }
   }
}
}

private boolean matchPattern(String url) {
for (Pattern pattern : patternList) {
   if (pattern.matcher(url).matches()) {
    return true;
   }
}

return false;
}

public static void main(String [] args) throws ServletException {
CacheFilter cf = new CacheFilter();
cf.init(null);
System.out.println(cf.matchPattern("/css/prototype.CSS"));
}
}
第二步:在classpath路径下创建一个cache-pattern.properties文件,内容如下:
Java代码
1 = .*ext-all.js   
2 = .*prototype.js   
3 = .*/css/.*\\.css 

1 = .*ext-all.js
2 = .*prototype.js
3 = .*/css/.*\\.css

在这个配置文件中,您可以根据js和css的路径来配置哪些目录,或者哪些文件需要设置max-age.

第三步:
在web.xml添加如下内容:
Java代码
<filter>   
          <filter-name>cache-filter</filter-name>   
          <filter-class>com.tudou.tudouadsales.component.web.filter.CacheFilter</filter-

class>   
          <init-param>   
             <param-name>cache-time</param-name>   
             <param-value>86000</param-value>   
         </init-param>   
     </filter>   
  
<filter-mapping>   
         <filter-name>cache-filter</filter-name>   
         <url-pattern>*.js</url-pattern>   
     </filter-mapping>   
       
     <filter-mapping>   
         <filter-name>cache-filter</filter-name>   
         <url-pattern>*.css</url-pattern>   
</filter-mapping> 


注:本文转自http://d-tune.iteye.com/blog/638715
分享到:
评论

相关推荐

    Tomcat无法加载css和js等静态资源文件的解决思路

    在开发和部署基于Java的Web应用时,Tomcat作为常用的Servlet容器,有时会出现无法加载CSS、JavaScript等静态资源的问题。这种情况通常会导致网页样式混乱、交互失效,严重影响用户体验。以下是一些针对这个问题的...

    tomcat7下部署的firefox中配置离线应用搭建相关代码

    清单文件包含了要被离线使用的资源列表,例如CSS、JavaScript、图片等。`appcache.manifest`文件通常包含如下内容: ```text CACHE MANIFEST # 版本号,用于更新缓存 # v1.0 # 缓存的静态资源 index.html style....

    Tomcat性能调优

    8. **部署优化**:尽量减小程序的启动时间和内存占用,例如,使用GraalVM的Native Image技术构建预编译的二进制可执行文件,或者通过Docker容器化部署,实现快速启动和资源隔离。 9. **资源加载优化**:优化Web应用...

    Nginx系列教程(四)| 一文带你读懂Nginx的动静分离.pdf

    静态页面的特点主要体现在页面内容不经常变化,与用户请求之间是一对一的关系,这些页面通常是HTML页面、JavaScript文件、CSS样式文件等。静态页面可以通过配置如Squid、Nginx、CDN等技术架构来加速,其最大的优点是...

    java版头像上传缩放裁剪功能

    使用Apache的Commons FileUpload库或者Spring框架的MultipartFile接口可以方便地接收和处理上传的图片文件。用户上传的文件会被临时存储在服务器的某个目录下,然后进行后续处理。 2. 图片预览: 图片预览功能需要...

    java开源包8

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包1

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包11

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包2

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包3

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包6

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包5

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包10

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包4

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包7

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包9

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    java开源包101

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    Java资源包01

    JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

    JAVA上百实例源码以及开源项目源代码

    (1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它,...

Global site tag (gtag.js) - Google Analytics