FastJson est utilisé pour analyser la configuration.
La copie de code est la suivante:
Package SALANDBUY.freemodule.web.filter;
Importer java.io.ioException;
import java.io.printwriter;
import java.io.stringwriter;
import java.util.arrays;
import java.util.hashmap;
Importer java.util.list;
importation java.util.map;
Importer javax.servlet.filterchain;
Importer javax.servlet.servletException;
Importer javax.servlet.http.httpservletRequest;
import javax.servlet.http.httpservletResponse;
Importer javax.servlet.http.httpservletResponseWrapper;
import com.alibaba.fastjson.json;
import com.alibaba.fastjson.jsonArray;
import com.alibaba.fastjson.jsonObject;
classe publique Cacherosp {
Temps de serte long privé = 1000 * 3;
Carte statique privée <chaîne, 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);
pour (map.entry <string, objet> entrée: cfg.entryset ()) {
String key = entry.getKey ();
Map <string, object> value = (map <string, object>) entry.getValue ();
Lister QueryStrings = (jsonArray) value.get (query_strings);
Integer cachedTime = (Integer) value.get (cached_time);
CacheInfo cacheInfo = new cacheInfo (queystrings, cachedtime);
cfgmap.put (key, cacheInfo);
}
}
public static void cacheddo (demande httpsservletRequest, réponse httpservletResponse, chaîne de filterchain) lance ioexception, servlexception {
CacheInfo cacheInfo = getCacheInfo (request);
String QueryString = request.getQueryString ();
// Si CacheInfo est vide, aucun cache n'est requis. Si le cache n'est pas vide, aucun cache n'est requis.
if (cacheInfo! = null) {
Long Now = System.Currenttimemillis ();
synchronisé (cachesp.class) {
if (now-cacheinfo.lastupdatetime> cacheinfo.cachedtime) {
System.out.println ("Non Utiliser Cache:");
Proxyresponse proxyresponse = new proxyresponse (réponse);
chain.dofilter (demande, proxyresponse);
cacheinfo.cachemap.put (queystrstring, proxyResponse.getBuffer ());
cacheInfo.LastupDateTime = maintenant;
}autre {
System.out.println ("Utiliser le cache");
}
}
String cachestr = cacheInfo.cachemap.get (queystring) .toString ();
réponse.getWriter (). Write (cachestr);
}autre {
chain.dofilter (demande, réponse);
}
}
Cacheinfo statique privé getCacheInfo (requête httpServleRequest) {
String key = request.getRequestruri (). Remplace (request.getContextPath (), "");
CacheInfo cacheInfo = cfgmap.get (key);
if (cacheInfo! = null &&
cacheInfo.NeedCache (request.getQuerystring ())) {
retour cacheInfo;
}
retourner null;
}
classe statique publique 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 (lister les requêtes, entier cachedtime) {
super();
if (cachedtime! = null) {
this.cachedtime = cachedtime;
}
this.Querystrings = quereystrings;
}
/ **
*
* @param quereystrings request.getQuerystring
* @retour
* /
public boolean NeedCache (String QueryStrings) {
If (QueryStrings == null) {// Lorsque les requêtes sont vides, toutes les requêtes sont mises en cache par défaut
Retour Vrai;
}
return QueryStrings.Contains (QueryStrings);
}
}
Classe statique privée ProxyResponse étend httpservletResponsewrapper {
private stringwriter sw = new StringWriter ();
// ByteArrayoutStream Baos privé Baos = new ByteArrayOutputStream ();
ProxyResponse publique (réponse httpservletResponse) {
super (réponse);
}
@Outrepasser
Public Printwriter getWriter () lève IOException {
retourner le nouveau Printwriter (SW);
}
public StringBuffer getBuffer () {
return sw.getBuffer ();
}
}
}