2015-10-21 1 views
9

Wie kann ich einen Verweis auf das CacheManager-Objekt im Shiro-Framework in irgendeinem Teil meiner Anwendung bekommen? Ich möchte zum Beispiel die alten Benutzerdaten entfernen, die beim Entfernen eines Benutzers oder beim Aktualisieren seiner Berechtigung zwischengespeichert wurden. Im Moment habe ich es WegWie bekomme ich den CacheManager von Shiro Framework in irgendeinem Teil der Anwendung

public void cleanUserCache(final String userName) { 
     final EmbeddedCacheManager embeddedCacheManager = securityRealmsProducer.getEmbeddedCacheManger(); 
     final Cache<Object, Object> authenticationCache = embeddedCacheManager.getCache("JPA-Auth-Realm.authenticationCache"); 
     final Cache<Object, Object> authrizationCache = embeddedCacheManager.getCache("JPA-Auth-Realm.authorizationCache"); 
     final Object userAuthenticationInfo = authenticationCache.get(userName); 
     if (userAuthenticationInfo != null) { 
      authenticationCache.remove(userName); 
      final SimpleAuthenticationInfo principle = (SimpleAuthenticationInfo) userAuthenticationInfo; 
      final SimplePrincipalCollection simple = (SimplePrincipalCollection) principle.getPrincipals(); 
      authorizationCache.remove(simple); 
     } 
    } 
+0

Was stimmt nicht mit dem, was Sie tun? Haben Sie sich auch das Singleton-Muster angesehen? Dieses Problem ist ziemlich genau das, wofür es ist! – JoeG

+0

Sie müssen vorsichtig mit dem Singleton-Muster sein. Sie sind anfällig für Nebenläufigkeitsprobleme mit der Initialisierung, wenn Sie es träge tun. – Kurtymckurt

Antwort

0

Wenn diese Klasse der einzige Ort ist, Sie nutzen den Cache folgenden bin Handhabung, können Sie einen letzten Hinweis auf den Cache halten. Es macht keinen Sinn, den Cache-Manager aufzurufen und Caches immer wieder neu zu laden.

Ich würde es im Konstruktor empfehlen, wenn Sie wissen, dass der Cache-Manager an diesem Punkt initialisiert wird.

Verwandte Themen