使用filter實(shí)現(xiàn)url級(jí)別內(nèi)存緩存示例
用到了fastJson用來(lái)解析配置,原理是通過(guò)自己實(shí)現(xiàn)response類來(lái)得到輸出的內(nèi)容
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é),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06java實(shí)現(xiàn)優(yōu)酷視頻地址解析示例代碼分享
最近做了一個(gè)在線視頻的下載器,需要解析youku的視頻,獲得真正的視頻地址,現(xiàn)在把解析過(guò)程記錄下來(lái)以供參考2014-01-01SpringBoot攔截器與文件上傳實(shí)現(xiàn)方法與源碼分析
其實(shí)spring boot攔截器的配置方式和springMVC差不多,只有一些小的改變需要注意下就ok了。本文主要給大家介紹了關(guān)于如何在Springboot實(shí)現(xiàn)登陸攔截器與文件上傳功能,需要的朋友可以參考下2022-10-10Java中常見(jiàn)字符串拼接九種方式詳細(xì)例子
這篇文章主要給大家介紹了關(guān)于Java中常見(jiàn)字符串拼接的九種方式,字符串拼接是我們?cè)贘ava代碼中比較經(jīng)常要做的事情,就是把多個(gè)字符串拼接到一起,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07Java 如何解析key為動(dòng)態(tài)的json操作
這篇文章主要介紹了Java 如何解析key為動(dòng)態(tài)的json操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02