一.Web.xml配置
<filter>
<filter-name>PageEhcacheFilter</filter-name>
<filter-class>com.X.PageEhcacheFilter</filter-class>
<init-param>
<param-name>cacheName</param-name>
<param-value>SimplePageCachingFilter</param-value>
</init-param>
<init-param>
<param-name>uris</param-name>
<param-value>/index.html,/channel/</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PageEhcacheFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
二.过滤器写法
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.constructs.web.filter.SimplePageCachingFilter;
/**
* Servlet Filter implementation class PageEhcacheFilter
*/
public class PageEhcacheFilter extends SimplePageCachingFilter {
// 已配置需要缓存的地址列表
private List<String> cachedUris;
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws Exception{
// 判断,如果请求的页面包含要缓存的url,就缓存, 否则,执行正常页面访问
String requestURI = request.getRequestURI();
// 判断是当前路径是否需要缓存
boolean cache = isConfiguredCache(request.getContextPath(), requestURI);
if(cache){
try {
super.doFilter(request, response, chain);
} catch (Exception e) {
throw e;
}
} else {
chain.doFilter(request, response);
}
}
@Override
public void doInit(FilterConfig config) throws CacheException {
super.doInit(config);
String patterns = filterConfig.getInitParameter("uris");
String[] strs = patterns.split(",");
cachedUris = new ArrayList<String>();
for (String str : strs) {
cachedUris.add(str);
}
}
@Override
protected boolean acceptsGzipEncoding(HttpServletRequest request) {
boolean ie6 = headerContains(request, "User-Agent", "MSIE 6.0");
boolean ie7 = headerContains(request, "User-Agent", "MSIE 7.0");
return acceptsEncoding(request, "gzip") || ie6 || ie7;
}
@SuppressWarnings("unchecked")
private boolean headerContains(final HttpServletRequest request,
final String header, final String value) {
logRequestHeaders(request);
final Enumeration<String> accepted = request.getHeaders(header);
while (accepted.hasMoreElements()) {
final String headerValue = accepted.nextElement();
if (headerValue.indexOf(value) != -1) {
return true;
}
}
return false;
}
/**
* @Title: isConfiguredCache
* @Description: 判断配置文件中是否配置了当前的路径
* @param path
* @param uri
* @return 设定文件
* @return boolean 返回类型
*/
private boolean isConfiguredCache(String path, String uri) {
boolean result = false;
String r = uri;
if (null != path && !"".equals(path)) {
r = r.substring(path.length());
}
if (cachedUris.contains(r)) {
result = true;
}
return result;
}
}
三.清除缓存的写法
/**
* @Title: cleanPageCache
* @Description: 显示/清除页面缓存
* @param request
* @param response
* @return
* @throws IOException
* 设定文件
* @return ModelAndView 返回类型
*/
@RequestMapping(value = "/cleanPageCache.htm")
public ModelAndView cleanPageCache(HttpServletRequestrequest, HttpServletResponse response) throws IOException {
String cacheName = "SimplePageCachingFilter";
Map<Object, Object> objects = CacheManagerAgent.instance().getCachedObjects(cacheName);
int count = 0;
JsonArray cacheArray = new JsonArray();
JsonObject cacheObject = null;
for (Entry<Object, Object>obj : objects.entrySet()) {
cacheObject = new JsonObject();
Object key = obj.getKey();
cacheObject.addProperty("order",count);
cacheObject.addProperty("items",key.toString());
cacheArray.add(cacheObject);
count++;
}
// 获取前台传的参数集合
@SuppressWarnings("unchecked")
Map<String, Object> paramsMap = request.getParameterMap();
// 判断集合是否为空
if (paramsMap !=null) {
for (Object s : paramsMap.keySet()) {
String key = request.getParameter(s.toString());
CacheManagerAgent.instance().remove(cacheName,key);
}
}
ModelAndView view = new ModelAndView("/cleanPageCache");
view.addObject("cacheNames",cacheArray);
return view;
}
/**
* @Title: cleanAllCache
* @Description: 清除所有的缓存
* @param request
* @param response
* @throws IOException
* 设定文件
* @return void 返回类型
*/
@RequestMapping(value = "/cleanAllCache.do", method = { RequestMethod.GET })
public void cleanAllCache(HttpServletRequestrequest, HttpServletResponse response) throws IOException {
String cacheName = "SimplePageCachingFilter";
Map<Object, Object> objects = CacheManagerAgent.instance().getCachedObjects(cacheName);
for (Entry<Object, Object>obj : objects.entrySet()) {
CacheManagerAgent.instance().remove(cacheName,obj.getKey().toString());
}
}
/**
* @Title: cleanMemoryCacheByKey
* @Description: 根据key清除内存缓存
* @param request
* @param response
* 设定文件
* @return void 返回类型
*/
@RequestMapping(value = "/cleanMemoryCacheByKey.do", method = RequestMethod.POST)
public void cleanMemoryCacheByKey(HttpServletRequestrequest, HttpServletResponse response) {
String params = request.getParameter("type");
if (StringUtils.isNotBlank(params)) {
if (params.equalsIgnoreCase("all")) {
// 清除所有缓存
DataCacheUtil.instance().clearMap();
} else {
DataCacheUtil.instance().removeObjectFromMapByKey(params);
}
}
}
@RequestMapping(value = "/cleanMemoryCacheByKey.do", method = RequestMethod.GET)
public void cleanMemoryCacheByKeyGet(HttpServletRequestrequest, HttpServletResponse response) {
String params = request.getParameter("type");
if (StringUtils.isNotBlank(params)) {
if (params.equalsIgnoreCase("all")) {
// 清除所有缓存
DataCacheUtil.instance().clearMap();
} else {
DataCacheUtil.instance().removeObjectFromMapByKey(params);
}
}
}
五.maven配置
<!-- ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-web</artifactId>
<version>2.0.4</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>