FastJson은 구성을 구문 분석하는 데 사용됩니다.
코드 사본은 다음과 같습니다.
saleandbuy.freemodule.web.filter 패키지;
import java.io.ioexception;
import java.io.printwriter;
import java.io.stringwriter;
import java.util.arrays;
java.util.hashmap import;
Java.util.list 가져 오기;
java.util.map import;
javax.servlet.filterchain import;
javax.servlet.servletexception import;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import javax.servlet.http.httpservletresponsewrapper;
com.alibaba.fastjson.json import;
com.alibaba.fastjson.jsonarray import;
com.alibaba.fastjson.jsonobject import;
공개 클래스 Cacheresp {
개인 장기 대기 시간 = 1000*3;
개인 정적 맵 <문자열, cacheinfo> cfgmap = new Hashmap <string, cacheresp.cacheinfo> ();
공개 정적 최종 문자열 query_strings = "QueryStrings";
공개 정적 최종 문자열 cached_time = "캐시드 타임";
공개 정적 최종 문자열 cache_config = "CacheConfig";
public static void config (string cfgjson) {
jsonobject cfg = json.parseobject (cfgjson);
for (map.Entry <string, object> entry : cfg.entryset ()) {
문자열 key = Entry.getKey ();
map <string, object> value = (map <string, object>) entry.getValue ();
List QueryStrings = (jsonArray) value.get (query_strings);
정수 캐시드 타임 = (정수) value.get (cached_time);
CACHEINFO CACHEINFO = 새로운 CACHEINFO (QueryStrings, CachedTime);
cfgmap.put (key, cacheinfo);
}
}
public static void cacheddo (httpservletrequest request, httpservletresponse 응답, 필터 체인 체인)는 ioexception, servletexception {
cacheinfo cacheinfo = getCacheInfo (요청);
문자열 QueryString = request.getQueryString ();
// CacheInfo가 비어 있으면 캐시가 비어 있지 않으면 캐시가 필요하지 않습니다.
if (cacheinfo! = null) {
long now = System.CurrentTimeMillis ();
동기화 된 (cacheresp.class) {
if (now-cacheinfo.lastupdateTime> CacheInfo.CachedTime) {
System.out.println ( "캐시를 사용하지 않음 :");
proxyResponse proxyResponse = 새로운 proxyResponse (응답);
Chain.dofilter (요청, proxyResponse);
cacheinfo.cachemap.put (QueryString, proxyResponse.getBuffer ());
cacheinfo.lastupdateTime = 지금;
}또 다른 {
System.out.println ( "캐시 사용");
}
}
문자열 cachest = cacheinfo.cachemap.get (QueryString) .toString ();
response.getWriter (). 쓰기 (캐시 스트);
}또 다른 {
Chain.dofilter (요청, 응답);
}
}
Private STATIC CACHEINFO getCacheInfo (httpservletrequest 요청) {
String key = request.getRequestUri (). replare (request.getContextPath (), "");
cacheinfo cacheinfo = cfgmap.get (key);
if (cacheinfo! = null &&
cacheinfo.needCache (request.getQueryString ())) {
CACHEINFO 리턴;
}
널 리턴;
}
공개 정적 클래스 cacheinfo {
public list querystrings = arrays.aslist (new String [] { "list", "index"});
공개 긴 캐시 타임 = 1000;
공개 Long LastupdateTime = 0;
공개지도 <문자열, StringBuffer> Cachemap = new Hashmap <String, StringBuffer> ();
public cacheinfo (목록 쿼리 스트링, 정수 캐시드 타임) {
감독자();
if (캐시드 타임! = null) {
this.cachedtime = 캐시드 타임;
}
this.querystrings = querystrings;
}
/**
*
* @param querystrings request.getQueryString
* @반품
*/
공개 부울 Needcache (String QueryStrings) {
if (QueryStrings == null) {// QueryStrings가 비어 있으면 모든 쿼리가 기본적으로 캐시됩니다.
진실을 반환하십시오.
}
반환 querystrings.contains (QueryStrings);
}
}
개인 정적 클래스 proxyResponse 확장 httpservletResponseWrapper {
private StringWriter sw = new StringWriter ();
// private bytearrayoutputStream baos = 새로운 BytearRayoutputStream ();
public proxyResponse (httpservletResponse 응답) {
슈퍼 (응답);
}
@보수
공개 인쇄기 getwriter ()는 ioexception {
새로운 Printwriter (SW)를 반환합니다.
}
공개 StringBuffer getBuffer () {
Sw.getBuffer ()를 반환합니다.
}
}
}