欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

使用filter實(shí)現(xiàn)url級(jí)別內(nèi)存緩存示例

 更新時(shí)間:2014年03月26日 09:11:01   作者:  
這篇文章主要介紹了使用filter實(shí)現(xiàn)url級(jí)別內(nèi)存緩存示例,只需要一個(gè)靜態(tài)類,在filter中調(diào)用,也可以全部寫(xiě)到filt里面??梢愿鶕?jù)查詢參數(shù)分別緩存,需要的朋友可以參考下

用到了fastJson用來(lái)解析配置,原理是通過(guò)自己實(shí)現(xiàn)response類來(lái)得到輸出的內(nèi)容

復(fù)制代碼 代碼如下:

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為空時(shí)默認(rèn)緩存所有的查詢
    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();
  }
 }
}

相關(guān)文章

  • Spring?代碼技巧梳理總結(jié)讓你愛(ài)不釋手

    Spring?代碼技巧梳理總結(jié)讓你愛(ài)不釋手

    這篇文章主要分享了Spring?代碼技巧梳理總結(jié),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • Maven如何修改打包文件名稱

    Maven如何修改打包文件名稱

    這篇文章主要介紹了Maven如何修改打包文件名稱問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java編寫(xiě)屬于自己的線程池

    java編寫(xiě)屬于自己的線程池

    這篇文章主要為大家詳細(xì)介紹了java編寫(xiě)屬于自己的線程池,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java實(shí)現(xiàn)優(yōu)酷視頻地址解析示例代碼分享

    java實(shí)現(xiàn)優(yōu)酷視頻地址解析示例代碼分享

    最近做了一個(gè)在線視頻的下載器,需要解析youku的視頻,獲得真正的視頻地址,現(xiàn)在把解析過(guò)程記錄下來(lái)以供參考
    2014-01-01
  • SpringBoot攔截器與文件上傳實(shí)現(xiàn)方法與源碼分析

    SpringBoot攔截器與文件上傳實(shí)現(xiàn)方法與源碼分析

    其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了。本文主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器與文件上傳功能,需要的朋友可以參考下
    2022-10-10
  • Java中常見(jiàn)字符串拼接九種方式詳細(xì)例子

    Java中常見(jiàn)字符串拼接九種方式詳細(xì)例子

    這篇文章主要給大家介紹了關(guān)于Java中常見(jiàn)字符串拼接的九種方式,字符串拼接是我們?cè)贘ava代碼中比較經(jīng)常要做的事情,就是把多個(gè)字符串拼接到一起,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • java排查死鎖示例

    java排查死鎖示例

    這篇文章主要介紹了java排查死鎖示例,通過(guò)java中簡(jiǎn)單的死鎖示例引出四種排查死鎖的工具,詳細(xì)講解請(qǐng)看全文,希望對(duì)大家有所幫助
    2021-08-08
  • 淺談Java中的this作為返回值時(shí)返回的是什么

    淺談Java中的this作為返回值時(shí)返回的是什么

    Java中的this作為返回值時(shí)返回的是什么?下面小編就為大家介紹一下Java中的this作為返回值時(shí)返回。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Java 如何解析key為動(dòng)態(tài)的json操作

    Java 如何解析key為動(dòng)態(tài)的json操作

    這篇文章主要介紹了Java 如何解析key為動(dòng)態(tài)的json操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java生成含字母和數(shù)字的6位隨機(jī)字符串

    Java生成含字母和數(shù)字的6位隨機(jī)字符串

    這篇文章主要為大家詳細(xì)介紹了Java生成含字母和數(shù)字的6位隨機(jī)字符串的相關(guān)資料,供大家參考,感興趣的朋友可以參考一下
    2016-05-05

最新評(píng)論