FastJson se usa para analizar la configuración.
La copia del código es la siguiente:
paquete salandbuy.freemodule.web.filter;
import java.io.ioException;
import java.io.printwriter;
import java.io.stringwriter;
importar 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;
clase pública Cacheresp {
Private Long Waittime = 1000*3;
Mapa estático privado <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 ()) {
Clave de cadena = 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 (clave, cacheinfo);
}
}
Public static void Cacheddo (solicitud httpservletRequest, respuesta httpservletResponse, filtreChain Chain) lanza ioexception, servletException {
Cacheinfo cacheinfo = getCacheinfo (solicitud);
String QueryString = request.getQueryString ();
// Si CacheInfo está vacío, no se requiere caché.
if (cacheinfo! = null) {
long Now = System.CurrentTimemillis ();
Sincronizado (Cacheresp.Class) {
if (ahora-cacheinfo.lastupdateTime> cacheinfo.cachedtime) {
System.out.println ("No use caché:");
ProxyResponse proxyResponse = new ProxyResponse (respuesta);
Chain.dofilter (solicitud, proxyResponse);
cacheinfo.cachemap.put (QueryString, proxyResponse.getBuffer ());
cacheinfo.lastupdateTime = ahora;
}demás {
System.out.println ("Use caché");
}
}
String Cachestr = CacheInfo.Cachemap.get (QueryString) .ToString ();
Response.getWriter (). Write (Cachestr);
}demás {
Chain.dofilter (solicitud, respuesta);
}
}
Cacheinfo estático privado getCacheinfo (solicitud httpservletrequest) {
Clave de cadena = request.getRequesturi (). Reemplazar (request.getContextPath (), "");
Cacheinfo cacheinfo = cfgmap.get (clave);
if (cacheinfo! = null &&
cacheinfo.needCache (request.getQueryString ())) {
devolver cacheInfo;
}
regresar nulo;
}
clase pública CacheInfo {
Lista pública QueryStrings = Arrays.aslist (nueva cadena [] {"Lista", "índice"});
Público CachedTime de Long Cached = 1000;
público durante mucho tiempo LastUpdatetime = 0;
Mapa público <String, StringBuffer> Cachemap = new Hashmap <String, StringBuffer> ();
Public CacheInfo (List QueryStrings, Integer Cachedtime) {
súper();
if (Cachedtime! = Null) {
this.cachedtime = Cachedtime;
}
this.queryStrings = QueryStrings;
}
/**
*
* @param Querystrings solicitud.getQuerystring
* @devolver
*/
Public boolean wencache (String QueryStrings) {
If (QueryStrings == null) {// Cuando QueryStrings está vacía, todas las consultas se almacenan en caché de forma predeterminada
devolver verdadero;
}
return QueryStrings.contains (QueryStrings);
}
}
Clase estática privada proxyResponse se extiende httpservletResponsewrapper {
privado stringwriter sw = new StringWriter ();
// private bytearRayOutputStream baos = new ByteArRayOutputStream ();
Public ProxyResponse (respuesta httpservletreSponse) {
super (respuesta);
}
@Anular
Public PrintWriter getWriter () lanza ioexception {
devolver nuevo PrintWriter (SW);
}
public StringBuffer getBuffer () {
return sw.getBuffer ();
}
}
}