يتم استخدام FastJson لتحليل التكوين.
نسخة الكود كما يلي:
حزمة saleandbuy.freemodule.web.filter ؛
استيراد java.io.ioException ؛
استيراد java.io.printwriter ؛
استيراد java.io.stringWriter ؛
استيراد java.util.arrays ؛
استيراد java.util.hashmap ؛
استيراد java.util.list ؛
استيراد java.util.map ؛
استيراد javax.servlet.filterchain ؛
استيراد javax.servlet.servletexception ؛
استيراد javax.servlet.http.httpservletrequest ؛
استيراد javax.servlet.http.httpservletresponse ؛
استيراد javax.servlet.http.httpservletResponseWrapper ؛
استيراد com.alibaba.fastjson.json ؛
استيراد com.alibaba.fastjson.jsonarray ؛
استيراد com.alibaba.fastjson.jsonobject ؛
الطبقة العامة cacheresp {
وقت الانتظار الطويل الخاص = 1000*3 ؛
خريطة ثابتة خاصة <string ، cacheinfo> cfgmap = new hashmap <string ، cacheresp.cacheinfo> () ؛
Static Final String Query_Strings = "QueryStrings" ؛
السلسلة النهائية الثابتة العامة Cached_time = "CachedTime" ؛
Static Final String CACHE_CONFIG = "CacheConfig" ؛
تكوين الفراغ الثابت العام (سلسلة CFGJSON) {
JSonObject CFG = JSON.ParseObject (CFGJSON) ؛
لـ (map.entry <string ، Object> intern: cfg.entryset ()) {
مفتاح السلسلة = intpling.getKey () ؛
خريطة <string ، object> value = (Map <String ، Object>) entry.getValue () ؛
قائمة QueryStrings = (jsonarray) value.get (query_strings) ؛
integer cachedtime = (integer) value.get (cached_time) ؛
cacheinfo cacheinfo = cacheinfo جديد (QueryStrings ، cachedtime) ؛
cfgmap.put (المفتاح ، cacheinfo) ؛
}
}
public static void cacheddo (طلب httpservletrequest ، استجابة httpservletresponse ، سلسلة filterchain) يلقي ioexception ، servlexception {
cacheinfo cacheinfo = getCacheInfo (request) ؛
String QueryString = request.getquerystring () ؛
// إذا كان Cacheinfo فارغًا ، فلا يلزم إجراء ذاكرة التخزين المؤقت.
if (cacheinfo! = null) {
طويل الآن = system.currentTimeMillis () ؛
متزامن (cacheresp.class) {
if (now cacheinfo.lastupdateTime> cacheinfo.cachedtime) {
System.out.println ("لا تستخدم ذاكرة التخزين المؤقت:") ؛
ProxyResponse ProxyResponse = New ProxyResponse (استجابة) ؛
Chain.dofilter (طلب ، proxyResponse) ؛
cacheinfo.cachemap.put (QueryString ، proxyResponse.getBuffer ()) ؛
cacheinfo.lastupdateTime = الآن ؛
}آخر {
System.out.println ("استخدام ذاكرة التخزين المؤقت") ؛
}
}
String cachestr = cacheinfo.cachemap.get (QueryString) .ToString () ؛
استجابة.
}آخر {
Chain.dofilter (طلب ، استجابة) ؛
}
}
خاص cacheinfo getCacheinfo (طلب httpservletrequest) {
مفتاح السلسلة = request.getRequesturi (). استبدال (request.getContextPath () ، "") ؛
cacheinfo cacheinfo = cfgmap.get (مفتاح) ؛
إذا (cacheinfo! = null &&
cacheinfo.needcache (request.getquerystring ())) {
إرجاع cacheinfo ؛
}
العودة لاغية.
}
الفئة الثابتة العامة cacheinfo {
القائمة العامة QueryStrings = arrays.aslist (سلسلة جديدة [] {"list" ، "index"}) ؛
وقت مخبأ طويل = 1000 ؛
العام طويل LastupDateTime = 0 ؛
الخريطة العامة <string ، stringBuffer> cachemap = new hashmap <string ، stringBuffer> () ؛
cacheinfo العامة (قائمة QueryStrings ، integer cachedtime) {
ممتاز()؛
if (cachedtime! = null) {
this.cachedtime = cachedtime ؛
}
this.querystrings = QueryStrings ؛
}
/**
*
* param querystrings request.getquerystring
* @يعود
*/
Boolean Needcache (سلسلة QueryStrings) {
if (QueryStrings == NULL) {// عندما تكون QueryStrings فارغة ، يتم تخزين جميع الاستعلامات مؤقتًا افتراضيًا
العودة صحيح.
}
إرجاع QueryStrings.contains (QueryStrings) ؛
}
}
يمتد ProxyResponsponse من الطبقة الثابتة الخاصة httpservletresponsewrapper {
StringWriter الخاص SW = جديد StringWriter () ؛
// bytearrayoutputstream baos = جديد bytearrayoutputstream () ؛
استجابة ProxyResponse العامة (HttPservletResponse) {
سوبر (استجابة) ؛
}
@تجاوز
printwriter public getWriter () يلقي ioException {
إرجاع New PrintWriter (SW) ؛
}
Public StringBuffer GetBuffer () {
إرجاع sw.getBuffer () ؛
}
}
}