importorg.apache.commons.lang.StringUtils;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.BeansException;importorg.springframework.context.ApplicationContext;importorg.springframework.context.ApplicationContextAware;importorg.springframework.data.redis.core.StringRedisTemplate;import javax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.util.concurrent.TimeUnit;public class RedisPageCacheFilter implementsFilter {private static final Logger log = LoggerFactory.getLogger(RedisPageCacheFilter.class);private staticApplicationContext ctx;private final static String FILTER_URL_PATTERNS = "patterns";private staticString[] cacheURLs;private static inttimeOut;
@Overridepublic void init(FilterConfig config) throwsServletException {
String patterns=config.getInitParameter(FILTER_URL_PATTERNS);
timeOut= Integer.parseInt(config.getInitParameter("expireTime"));
cacheURLs= StringUtils.split(patterns, ",");
}
@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throwsIOException, ServletException {
HttpServletResponse resp=(HttpServletResponse) servletResponse;
HttpServletRequest request=(HttpServletRequest) servletRequest;
String url=request.getRequestURI();boolean flag = false;if (cacheURLs != null && cacheURLs.length > 0) {for(String cacheURL : cacheURLs) {if (url.contains(cacheURL.trim())||url.matches(cacheURL)) {
flag= true;break;
}
}
}//如果包含我们要缓存的url 就缓存该页面,否则执行正常的页面转向
if(flag) {
String query=request.getQueryString();if (query != null) {
query= "?" +query;
}final String key="REDISCACHE:"+url+query;
log.info("当前请求缓存为:" + url +query);//访问的是主页//从缓存中得到主页html
String html =getHtmlFromCache(key);if (null ==html) {//缓存中没有//截取生成的html并放入缓存
log.info("缓存不存在,生成缓存");
ResponseWrapper wrapper= newResponseWrapper(resp);//***** 以上代码在请求被处理之前执行 *****
filterChain.doFilter(servletRequest, wrapper);//***** 以下代码在请求被处理后前执行 *****//放入缓存
html =wrapper.getResult();
putIntoCache(key,html);
}//返回响应
resp.setContentType("text/html; charset=utf-8");
resp.getWriter().print(html);
}else{
filterChain.doFilter(servletRequest, resp);return;
}
}
@Overridepublic voiddestroy() {
}privateString getHtmlFromCache(String redisKey) {returnRedisUtil.get(redisKey);
}private voidputIntoCache(String redisKey,String html) {
RedisUtil.set(redisKey, html,timeOut*60);
}
}