使用filter实现url级别内存缓存示例

所属分类: 软件编程 / java 阅读数: 67
收藏 0 赞 0 分享

用到了fastJson用来解析配置,原理是通过自己实现response类来得到输出的内容

复制代码 代码如下:

package saleandbuy.freemodule.web.filter;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

public class CacheResp {
 private long waitTime=1000*3;

 private static Map<String,CacheInfo> cfgMap=new HashMap<String, CacheResp.CacheInfo>();

 public static final String QUERY_STRINGS="queryStrings";
 public static final String CACHED_TIME="cachedTime";
 public static final String CACHE_CONFIG="cacheConfig";

 public static void config(String cfgJson) {
  JSONObject cfg=JSON.parseObject(cfgJson);
  for (Map.Entry<String, Object> entry : cfg.entrySet()) {
   String key=entry.getKey();
   Map<String, Object> value=(Map<String, Object>) entry.getValue();
   List queryStrings= (JSONArray)value.get(QUERY_STRINGS);
   Integer cachedTime=(Integer) value.get(CACHED_TIME);
   CacheInfo cacheInfo=new CacheInfo(queryStrings,cachedTime);
   cfgMap.put(key, cacheInfo);
  }
 }

 public static void cachedDo(HttpServletRequest request, HttpServletResponse response,FilterChain chain) throws IOException, ServletException {
  CacheInfo cacheInfo=getCacheInfo(request);
  String queryString=request.getQueryString();
  //cacheInfo为空则不需要缓存,不为空则需要缓存
  if(cacheInfo!=null){
   long now=System.currentTimeMillis();
   synchronized (CacheResp.class) {
    if(now-cacheInfo.lastUpdateTime>cacheInfo.cachedTime){
     System.out.println("not use cache:"); 
     ProxyResponse proxyResponse=new ProxyResponse(response);
     chain.doFilter(request, proxyResponse);
     cacheInfo.cacheMap.put(queryString, proxyResponse.getBuffer());
     cacheInfo.lastUpdateTime=now;
    }else {
     System.out.println("use cache");
    }
   }
   String cacheStr=cacheInfo.cacheMap.get(queryString).toString();
   response.getWriter().write(cacheStr);
  }else {
   chain.doFilter(request, response);
  }
 }

 private static CacheInfo getCacheInfo(HttpServletRequest request){
  String key=request.getRequestURI().replace(request.getContextPath(), "");
  CacheInfo cacheInfo=cfgMap.get(key);
  if(cacheInfo!=null&&
    cacheInfo.needCache(request.getQueryString())){
   return cacheInfo;
  }
  return null;
 }

 public static class CacheInfo{
  public List queryStrings=Arrays.asList(new String[]{"list","index"});
  public long cachedTime=1000;
  public long lastUpdateTime=0;
  public Map<String, StringBuffer> cacheMap=new HashMap<String, StringBuffer>();

  public CacheInfo(List queryStrings, Integer cachedTime) {
   super();
   if(cachedTime!=null){
    this.cachedTime = cachedTime;
   }
   this.queryStrings = queryStrings;
  }

  /**
   *
   * @param queryStrings request.getQueryString
   * @return
   */
  public boolean needCache(String queryStrings) {
   if(queryStrings==null){//queryStrings为空时默认缓存所有的查询
    return true;
   }
   return queryStrings.contains(queryStrings);
  }

 }

 private static class ProxyResponse extends HttpServletResponseWrapper{

  private StringWriter sw=new StringWriter();

//  private ByteArrayOutputStream baos=new ByteArrayOutputStream();

  public ProxyResponse(HttpServletResponse response) {
   super(response);
  }

  @Override
  public PrintWriter getWriter() throws IOException {
   return new PrintWriter(sw);
  }

  public StringBuffer getBuffer() {
   return sw.getBuffer();
  }
 }
}

更多精彩内容其他人还在看

利用MultipartFile实现文件上传功能

这篇文章主要为大家详细介绍了利用MultipartFile实现文件上传功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

Java编程实现NBA赛事接口调用实例代码

这篇文章主要介绍了Java编程实现NBA赛事接口调用实例代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java编程之双重循环打印图形

这篇文章主要介绍了Java编程之双重循环打印图形,属于Java编程基础练习部分,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

java基础学习JVM中GC的算法

这篇文章主要介绍了java基础学习JVM中GC的算法,通过图文加深对GC算法思路的理解。
收藏 0 赞 0 分享

Java编程Post数据请求和接收代码详解

这篇文章主要介绍了Java编程Post数据请求和接收代码详解,涉及enctype的三种编码,post与get等相关内容,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Retrofit+Rxjava实现文件上传和下载功能

这篇文章主要介绍了Retrofit+Rxjava实现文件上传和下载功能,文中提到了单文件上传和多文件上传及相关参数的请求,需要的朋友参考下吧
收藏 0 赞 0 分享

Retrofit+Rxjava下载文件进度的实现

这篇文章主要介绍了Retrofit+Rxjava下载文件进度的实现,非常不错,具有参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

java检查服务器的连通两种方法代码分享

这篇文章主要介绍了java检查服务器的连通两种方法代码分享,涉及ping的介绍以及检查服务器连通的两种方法代码示例,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享

Java/Android 获取网络重定向文件的真实URL的示例代码

本篇文章主要介绍了Java/Android 获取网络重定向文件的真实URL的示例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
收藏 0 赞 0 分享

java并发编程之同步器代码示例

这篇文章主要介绍了java并发编程之同步器代码示例,分享了相关代码,具有一定参考价值,需要的朋友可以了解下。
收藏 0 赞 0 分享
查看更多