java http查询参数进行缓存,使用filter实现url级别内存缓存示例

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 cfgMap=new HashMap();

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 entry : cfg.entrySet()) {

String key=entry.getKey();

Map value=(Map) 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 cacheMap=new HashMap();

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();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值