如何在只使用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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在使用Tomcat时无法加载JSCSS等静态文件,这可能是因为Tomcat没有正确地配置Web应用程序的上下文路径。你可以尝试以下几个解决方案: 1. 检查文件路径是否正确 首先,确保文件路径正确,并且文件确实位于指定的位置。你可以在浏览器中手动输入文件路径来检查文件是否存在。 2. 配置上下文路径 在Tomcat中,每个Web应用程序都有一个上下文路径(context path),它是应用程序的唯一标识符。如果未正确配置上下文路径,则Tomcat无法找到静态文件。你可以通过在web.xml文件中添加以下代码来配置上下文路径: ``` <context-param> <param-name>contextPath</param-name> <param-value>/your-context-path</param-value> </context-param> ``` 其中,"your-context-path"是你的Web应用程序的上下文路径。 3. 配置Tomcat的虚拟主机 如果你在Tomcat中配置了虚拟主机,则需要将虚拟主机的别名添加到Web应用程序的上下文路径中。你可以通过编辑server.xml文件来添加虚拟主机的别名: ``` <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Alias>your-domain-name</Alias> </Host> ``` 其中,"your-domain-name"是你的虚拟主机的别名。 4. 检查Tomcat缓存 如果Tomcat缓存不正确,则可能会导致静态文件无法加载。你可以尝试清除Tomcat缓存来解决这个问题。 如果以上方法都无法解决问题,你可以尝试重新安装Tomcat或者使用其他Web服务器来托管你的应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值