2015-10-21 14 views
9

Come posso ottenere un riferimento all'oggetto cacheManager nel framework Shiro in qualsiasi parte della mia applicazione? Ad esempio, voglio rimuovere i vecchi dati utente che sono stati memorizzati nella cache durante la rimozione di un utente o l'aggiornamento della sua autorizzazione. In questo momento sto maneggiarlo modo seguenteCome posso ottenere il cacheManager dal framework shiro in qualsiasi parte dell'applicazione

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

Cosa c'è di sbagliato in quello che stai facendo? Inoltre, hai guardato il pattern Singleton? Questo problema è praticamente quello che è! – JoeG

+0

Devi stare attento con il modello singleton. Sei suscettibile di problemi di concorrenza con l'inizializzazione se lo fai pigramente. – Kurtymckurt

risposta

0

Se questa classe è l'unico posto si sta utilizzando la cache, si può tenere un riferimento finale alla cache. È inutile chiamare per ottenere cache manager e cache più e più volte.

Si consiglia di farlo nel costruttore se si sa che il gestore cache è inizializzato in quel punto.