FastJson digunakan untuk parse konfigurasi.
Salinan kode adalah sebagai berikut:
paket saleandbuy.freemodule.web.filter;
impor java.io.ioException;
impor java.io.printwriter;
impor java.io.stringwriter;
impor java.util.arrays;
impor java.util.hashmap;
impor java.util.list;
impor java.util.map;
impor javax.servlet.filterchain;
impor javax.servlet.servletException;
impor javax.servlet.http.httpservletRequest;
impor javax.servlet.http.httpservletResponse;
impor javax.servlet.http.httpservletResponsewrapper;
impor com.alibaba.fastjson.json;
impor com.alibaba.fastjson.jsonarray;
impor com.alibaba.fastjson.jsonobject;
Cacheresp kelas publik {
WAITTIME PANJANG PRIBADI = 1000*3;
peta statis pribadi <string, cacheinfo> cfgmap = hashmap baru <string, cacheresp.cacheinfo> ();
string final statis public query_strings = "querystrings";
Public Static Final String Cached_Time = "CachedTime";
string final statis publik cache_config = "cacheconfig";
public static void config (string cfgjson) {
JsonObject cfg = json.parseObject (cfgjson);
untuk (map.entry <string, objek> entri: cfg.entryset ()) {
String key = entry.getKey ();
Peta <String, Object> value = (MAP <String, Object>) Entry.getValue ();
Daftar querystrings = (jsonarray) value.get (query_strings);
Integer CachedTime = (integer) value.get (cacheed_time);
CacheINFO CacheINFO = CacheINFO baru (Querystrings, CacheDtime);
cfgmap.put (kunci, cacheeinfo);
}
}
public static void Cacheddo (permintaan httpservletrequest, respons httpservletresponse, rantai filterchain) melempar ioException, servletException {
CacheINFO CacheINFO = getCacheInfo (permintaan);
String queryString = request.getQueryString ();
// Jika CacheINFO kosong, tidak ada cache yang diperlukan.
if (cacheinfo! = null) {
long now = system.currentTimemillis ();
disinkronkan (Cacheresp.class) {
if (sekarang cacheinfo.lastupDateTime> cacheinfo.cacheedtime) {
System.out.println ("Tidak menggunakan cache:");
ProxyResponse ProxyResponse = ProxyResponse baru (Respons);
rantai.dofilter (permintaan, proxyresponse);
cacheinfo.cachemap.put (querystring, proxyresponse.getBuffer ());
CacheInfo.LastUpDateTime = sekarang;
}kalau tidak {
System.out.println ("Gunakan cache");
}
}
String cacheStr = CacheInfo.cachemap.get (queryString) .toString ();
response.getWriter (). Write (Cachestr);
}kalau tidak {
rantai.dofilter (permintaan, respons);
}
}
private static cacheinfo getCacheInfo (permintaan httpservletrequest) {
String key = request.getRequesturi (). REPLACE (request.getContextPath (), "");
CacheINFO CacheINFO = cfgmap.get (key);
if (cacheinfo! = null &&
cacheinfo.needcache (request.getQueryString ())) {
mengembalikan CacheINFO;
}
kembali nol;
}
CacheINFO kelas statis publik {
querystrings daftar publik = arrays.aslist (string baru [] {"daftar", "index"});
Publik Long Cachedtime = 1000;
Publik Long LastDateTime = 0;
Peta Publik <String, StringBuffer> CACHEMAP = HashMap baru <String, StringBuffer> ();
CacheINFO PUBLIK (Daftar Querystrings, Integer Cachedtime) {
super();
if (CachedTime! = null) {
this.cachedtime = CacheDtime;
}
this.querystrings = querystrings;
}
/**
*
* @param querystrings request.getQueryString
* @kembali
*/
public boolean needcache (string querystrings) {
If (querystrings == null) {// Saat querystrings kosong, semua kueri di -cache secara default
Kembali Benar;
}
return querystrings.contains (querystrings);
}
}
ProxyResponse kelas statis pribadi memperluas httpservletResponsewrapper {
Private StringWriter SW = New StringWriter ();
// private bytearrayoutputStream baos = new bytearrayoutputStream ();
ProxyResponse publik (respons httpservletResponse) {
super (respons);
}
@Mengesampingkan
Public Printwriter getWriter () melempar ioException {
mengembalikan printwriter baru (SW);
}
Public StringBuffer getBuffer () {
return sw.getBuffer ();
}
}
}