最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用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)類(lèi),在filter中調(diào)用,也可以全部寫(xiě)到filt里面。可以根據(jù)查詢(xún)參數(shù)分別緩存,需要的朋友可以參考下

用到了fastJson用來(lái)解析配置,原理是通過(guò)自己實(shí)現(xiàn)response類(lèi)來(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)緩存所有的查詢(xú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)文章

  • springboot 在linux后臺(tái)運(yùn)行的方法

    springboot 在linux后臺(tái)運(yùn)行的方法

    這篇文章主要介紹了springboot 在linux后臺(tái)運(yùn)行的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • Java 高并發(fā)九:鎖的優(yōu)化和注意事項(xiàng)詳解

    Java 高并發(fā)九:鎖的優(yōu)化和注意事項(xiàng)詳解

    本文主要介紹Java高并發(fā)鎖的優(yōu)化和注意事項(xiàng),這里整理了詳細(xì)的資料,并講解了 1. 鎖優(yōu)化的思路和方法 2. 虛擬機(jī)內(nèi)的鎖優(yōu)化 3. 一個(gè)錯(cuò)誤使用鎖的案例 4. ThreadLocal及其源碼分析等知識(shí),有需要的小伙伴可以參考下
    2016-09-09
  • SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能

    SpringBoot詳解整合Spring?Boot?Admin實(shí)現(xiàn)監(jiān)控功能

    這篇文章主要介紹了SpringBoot整合Spring?Boot?Admin實(shí)現(xiàn)服務(wù)監(jiān)控,內(nèi)容包括Server端服務(wù)開(kāi)發(fā),Client端服務(wù)開(kāi)發(fā)其中Spring?Boot?Admin還可以對(duì)其監(jiān)控的服務(wù)提供告警功能,如服務(wù)宕機(jī)時(shí),可以及時(shí)以郵件方式通知運(yùn)維人員,感興趣的朋友跟隨小編一起看看吧
    2022-07-07
  • Selenium Webdriver實(shí)現(xiàn)截圖功能的示例

    Selenium Webdriver實(shí)現(xiàn)截圖功能的示例

    今天小編就為大家分享一篇Selenium Webdriver實(shí)現(xiàn)截圖功能的示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • springboot實(shí)用配置詳細(xì)圖文教程

    springboot實(shí)用配置詳細(xì)圖文教程

    SpringBoot從本質(zhì)上來(lái)說(shuō)就是Spring,它通過(guò)了一些自己的特性幫助我們簡(jiǎn)化了Spring應(yīng)用程序的開(kāi)發(fā),下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)用配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java 數(shù)組分析及簡(jiǎn)單實(shí)例

    Java 數(shù)組分析及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了Java 數(shù)組分析及簡(jiǎn)單實(shí)例的相關(guān)資料,在Java中它就是對(duì)象,一個(gè)比較特殊的對(duì)象,需要的朋友可以參考下
    2017-03-03
  • springBoot 整合ModBus TCP的詳細(xì)過(guò)程

    springBoot 整合ModBus TCP的詳細(xì)過(guò)程

    ModBus是一種串行通信協(xié)議,用于從儀器和控制設(shè)備傳輸信號(hào)到主控制器或數(shù)據(jù)采集系統(tǒng),它分為主站和從站,主站獲取和編寫(xiě)數(shù)據(jù),從站則是設(shè)備,本文給大家介紹springBoot 整合ModBus TCP的詳細(xì)過(guò)程,感興趣的朋友一起看看吧
    2025-01-01
  • 詳解Spring中接口的bean是如何注入的

    詳解Spring中接口的bean是如何注入的

    這篇文章主要介紹了詳解Spring中接口的bean是如何注入的的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • SpringBoot事務(wù)注解超詳細(xì)講解

    SpringBoot事務(wù)注解超詳細(xì)講解

    這篇文章主要給大家介紹了關(guān)于SpringBoot事務(wù)注解的相關(guān)資料,在Spring Boot中,事務(wù)管理是一個(gè)非常重要的概念,我們可以使用事務(wù)注解來(lái)控制事務(wù)的行為,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Spring MVC---數(shù)據(jù)綁定和表單標(biāo)簽詳解

    Spring MVC---數(shù)據(jù)綁定和表單標(biāo)簽詳解

    本篇文章主要介紹了Spring MVC---數(shù)據(jù)綁定和表單標(biāo)簽詳解,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-01-01

最新評(píng)論

蓬安县| 手机| 阿拉尔市| 锦屏县| 湘潭县| 凌云县| 昌平区| 嫩江县| 辉南县| 东乌| 巴林右旗| 偃师市| 宣化县| 色达县| 增城市| 襄汾县| 伊宁市| 吐鲁番市| 桂林市| 永顺县| 常山县| 玉龙| 烟台市| 尼勒克县| 邢台市| 吉首市| 靖远县| 新宁县| 五指山市| 衡阳县| 镇巴县| 巴青县| 洪湖市| 桓台县| 栾川县| 平潭县| 宜阳县| 中牟县| 芜湖县| 西城区| 秀山|