最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot中Shiro緩存使用Redis、Ehcache的方法

 更新時(shí)間:2019年09月09日 10:34:53   作者:云揚(yáng)四海  
這篇文章主要介紹了SpringBoot中Shiro緩存使用Redis、Ehcache的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

SpringBoot 中配置redis作為session 緩存器。 讓shiro引用

本文是建立在你是使用這shiro基礎(chǔ)之上的補(bǔ)充內(nèi)容

第一種:Redis緩存,將數(shù)據(jù)存儲(chǔ)到redis 并且開(kāi)啟session存入redis中。

引入pom

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.session</groupId>
      <artifactId>spring-session-data-redis</artifactId>
   </dependency>

配置redisConfig

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
  @Bean
  public KeyGenerator keyGenerator() {
    return new KeyGenerator() {
      @Override
      public Object generate(Object target, Method method, Object... params) {
        StringBuilder sb = new StringBuilder();
        sb.append(target.getClass().getName());
        sb.append(method.getName());
        for (Object obj : params) {
          sb.append(obj.toString());
        }
        return sb.toString();
      }
    };
  }
  

  @Bean
  //在這里配置緩存reids配置
  public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
        .entryTtl(Duration.ofHours(1)); // 設(shè)置緩存有效期一小時(shí)
    System.out.println("《========【開(kāi)啟redis】 ======== 》 ");
    return RedisCacheManager
        .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
        .cacheDefaults(redisCacheConfiguration).build();
  }

  @Bean
  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
    StringRedisTemplate template = new StringRedisTemplate(factory);
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    template.setValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
  }

}

配置自定義緩存管理器,引入redis緩存管理器

定義自己的CacheManager

/**
 * <p> 自定義cacheManage 擴(kuò)張shiro里面的緩存 使用reids作緩存 </p> 
 * <description>
 * 引入自己定義的CacheManager 
 * 關(guān)于CacheManager的配置文件在spring-redis-cache.xml中
 * </description>
 */
@Component
public class ShiroSpringCacheManager implements CacheManager ,Destroyable{
  /**
   * 將之上的RedisCacheManager的Bean拿出來(lái) 注入于此
   */
  @Autowired
  private org.springframework.cache.CacheManager cacheManager;
   
  public org.springframework.cache.CacheManager getCacheManager() {
    return cacheManager;
  }

  public void setCacheManager(org.springframework.cache.CacheManager cacheManager) {
    this.cacheManager = cacheManager;
  }

  @Override
  public void destroy() throws Exception {
    cacheManager = null;
  }

  @Override
  public <K, V> Cache<K, V> getCache(String name) {
    if (name == null ){
      return null;
    }
    // 新建一個(gè)ShiroSpringCache 將Bean放入并實(shí)例化
    return new ShiroSpringCache<K,V>(name,getCacheManager());
  }


}

定義自己實(shí)現(xiàn)的Shiro的Cache,實(shí)現(xiàn)了Shiro包里的Cache

/**
 * <p> 自定義緩存 將數(shù)據(jù)存入到redis中 </p>
 */
@SuppressWarnings("unchecked")
public class ShiroSpringCache<K,V> implements org.apache.shiro.cache.Cache<K, V>{
  private static final Logger log = LoggerFactory.getLogger(ShiroSpringCache.class);
  private CacheManager cacheManager;
  private Cache cache;

  public ShiroSpringCache(String name, CacheManager cacheManager) {
    if(name==null || cacheManager==null){
      throw new IllegalArgumentException("cacheManager or CacheName cannot be null.");
    }
    this.cacheManager = cacheManager;
    //這里首先是從父類中獲取這個(gè)cache,如果沒(méi)有會(huì)創(chuàng)建一個(gè)redisCache,初始化這個(gè)redisCache的時(shí)候
    //會(huì)設(shè)置它的過(guò)期時(shí)間如果沒(méi)有配置過(guò)這個(gè)緩存的,那么默認(rèn)的緩存時(shí)間是為0的,如果配置了,就會(huì)把配置的時(shí)間賦予給這個(gè)RedisCache
    //如果從緩存的過(guò)期時(shí)間為0,就表示這個(gè)RedisCache不存在了,這個(gè)redisCache實(shí)現(xiàn)了spring中的cache
    this.cache= cacheManager.getCache(name);
  }
  @Override
  public V get(K key) throws CacheException {
    log.info("從緩存中獲取key為{}的緩存信息",key);
    if(key == null){
      return null;
    }
    ValueWrapper valueWrapper = cache.get(key);
    if(valueWrapper==null){
      return null;
    }
    return (V) valueWrapper.get();
  }

  @Override
  public V put(K key, V value) throws CacheException {
    log.info("創(chuàng)建新的緩存,信息為:{}={}",key,value);
    cache.put(key, value);
    return get(key);
  }

  @Override
  public V remove(K key) throws CacheException {
    log.info("干掉key為{}的緩存",key);
    V v = get(key);
    cache.evict(key);//干掉這個(gè)名字為key的緩存
    return v;
  }

  @Override
  public void clear() throws CacheException {
    log.info("清空所有的緩存");
    cache.clear();
  }

  @Override
  public int size() {
    return cacheManager.getCacheNames().size();
  }

  /**
   * 獲取緩存中所的key值
   */
  @Override
  public Set<K> keys() {
    return (Set<K>) cacheManager.getCacheNames();
  }

  /**
   * 獲取緩存中所有的values值
   */
  @Override
  public Collection<V> values() {
    return (Collection<V>) cache.get(cacheManager.getCacheNames()).get();
  }

  @Override
  public String toString() {
    return "ShiroSpringCache [cache=" + cache + "]";
  }
}

到此為止,使用redis做緩存,和spring的集成就完成了。

可以使用以下注解將緩存放入redis

 @Cacheable(value = Cache.CONSTANT, key = "'" + CacheKey.DICT_NAME + "'+#name+'_'+#val")

配置spring session管理器

  @Bean
  @ConditionalOnProperty(prefix = "xpro", name = "spring-session-open", havingValue = "true")
  public ServletContainerSessionManager servletContainerSessionManager() {
    return new ServletContainerSessionManager();
  }

新建類 spring session設(shè)置session過(guò)期時(shí)間

/**
 * spring session配置
 *
 * @author xingri
 * @date 2017-07-13 21:05
 */
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 900) //session過(guò)期時(shí)間 如果部署多機(jī)環(huán)境,需要打開(kāi)注釋
@ConditionalOnProperty(prefix = "xpro", name = "spring-session-open", havingValue = "true")
public class SpringSessionConfig {

}

第一種:Ehcache做緩存,可以將數(shù)據(jù)存儲(chǔ)到磁盤中,也可以存到內(nèi)存中

新建ehcache.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" dynamicConfig="false">
  <diskStore path="java.io.tmpdir"/>
  <!--授權(quán)信息緩存-->
  <cache name="authorizationCache"
      maxEntriesLocalHeap="2000"
      eternal="false"
      timeToIdleSeconds="1800"
      timeToLiveSeconds="1800"
      overflowToDisk="false"
      statistics="true">
  </cache>
<!--身份信息緩存-->
  <cache name="authenticationCache"
      maxEntriesLocalHeap="2000"
      eternal="false"
      timeToIdleSeconds="1800"
      timeToLiveSeconds="1800"
      overflowToDisk="false"
      statistics="true">
  </cache>
<!--session緩存-->
  <cache name="activeSessionCache"
      maxEntriesLocalHeap="2000"
      eternal="false"
      timeToIdleSeconds="1800"
      timeToLiveSeconds="1800"
      overflowToDisk="false"
      statistics="true">
  </cache>

  <!-- 緩存半小時(shí) -->
  <cache name="halfHour"
      maxElementsInMemory="10000"
      maxElementsOnDisk="100000"
      eternal="false"
      timeToIdleSeconds="1800"
      timeToLiveSeconds="1800"
      overflowToDisk="false"
      diskPersistent="false" />

  <!-- 緩存一小時(shí) -->
  <cache name="hour"
      maxElementsInMemory="10000"
      maxElementsOnDisk="100000"
      eternal="false"
      timeToIdleSeconds="3600"
      timeToLiveSeconds="3600"
      overflowToDisk="false"
      diskPersistent="false" />

  <!-- 緩存一天 -->
  <cache name="oneDay"
      maxElementsInMemory="10000"
      maxElementsOnDisk="100000"
      eternal="false"
      timeToIdleSeconds="86400"
      timeToLiveSeconds="86400"
      overflowToDisk="false"
      diskPersistent="false" />

  <!--
    name:緩存名稱。
    maxElementsInMemory:緩存最大個(gè)數(shù)。
    eternal:對(duì)象是否永久有效,一但設(shè)置了,timeout將不起作用。
    timeToIdleSeconds:設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,可選屬性,默認(rèn)值是0,也就是可閑置時(shí)間無(wú)窮大。
    timeToLiveSeconds:設(shè)置對(duì)象在失效前允許存活時(shí)間(單位:秒)。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,默認(rèn)是0.,也就是對(duì)象存活時(shí)間無(wú)窮大。
    overflowToDisk:當(dāng)內(nèi)存中對(duì)象數(shù)量達(dá)到maxElementsInMemory時(shí),Ehcache將會(huì)對(duì)象寫(xiě)到磁盤中。
    diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)。
    maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。
    diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
    diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒。
    memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí),Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存。默認(rèn)策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)。
    clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除。
  -->
  <defaultCache name="defaultCache"
         maxElementsInMemory="10000"
         eternal="false"
         timeToIdleSeconds="600"
         timeToLiveSeconds="600"
         overflowToDisk="false"
         maxElementsOnDisk="100000"
         diskPersistent="false"
         diskExpiryThreadIntervalSeconds="120"
         memoryStoreEvictionPolicy="LRU"/>

</ehcache>

配置自定義緩存管理器,引入ehcache緩存管理器

/**
 * ehcache配置
 *
 */
@Configuration
@EnableCaching
public class EhCacheConfig {

  /**
   * EhCache的配置
   */
  @Bean
  public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
    MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
    ManagementService.registerMBeans(cacheManager, mBeanServer, true, true, true, true);
    return new EhCacheCacheManager(cacheManager);
  }

  /**
   * EhCache的配置
   */
  @Bean
  public EhCacheManagerFactoryBean ehcache() {
    System.out.println("《========【開(kāi)啟ehcache】 ======== 》 ");
    EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
    ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
    return ehCacheManagerFactoryBean;
  }
  
  @Bean
  public org.apache.shiro.cache.CacheManager getCacheShiroManager(EhCacheManagerFactoryBean ehcache) {
    EhCacheManager ehCacheManager = new EhCacheManager();
    ehCacheManager.setCacheManager(ehcache.getObject());
    return ehCacheManager;
  }
}

最后 最重要的是引入shriro 中

/**
 * shiro權(quán)限管理的配置
 *
 */
@Configuration
public class ShiroConfig {

  /**
   * 安全管理器
   */
  @Bean
  public DefaultWebSecurityManager securityManager(CookieRememberMeManager rememberMeManager, CacheManager cacheShiroManager, SessionManager sessionManager) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setAuthenticator(modularRealmAuthenticator());

    List<Realm> realms=new ArrayList<>();
    securityManager.setRealms(realms);

    securityManager.setCacheManager(cacheShiroManager);

    securityManager.setRememberMeManager(rememberMeManager);
    securityManager.setSessionManager(sessionManager);
    return securityManager;
  }


  /**
   * spring session管理器(多機(jī)環(huán)境)
   */
  @Bean
  public ServletContainerSessionManager servletContainerSessionManager() {
    return new ServletContainerSessionManager();
  }

  /**
   * session管理器(單機(jī)環(huán)境) 使用cookie存儲(chǔ)緩存。。如果多級(jí)請(qǐng)注釋
   */
  @Bean
  public DefaultWebSessionManager defaultWebSessionManager(CacheManager cacheShiroManager, XProProperties xProProperties) {
    DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
    sessionManager.setCacheManager(cacheShiroManager);
    sessionManager.setSessionValidationInterval(xProProperties.getSessionValidationInterval() * 1000);
    sessionManager.setGlobalSessionTimeout(xProProperties.getSessionInvalidateTime() * 1000);
    sessionManager.setDeleteInvalidSessions(true);
    sessionManager.setSessionValidationSchedulerEnabled(true);
    Cookie cookie = new SimpleCookie(ShiroHttpSession.DEFAULT_SESSION_ID_NAME);
    cookie.setName("shiroCookie");
    cookie.setHttpOnly(true);
    sessionManager.setSessionIdCookie(cookie);
    return sessionManager;
  }



  /**
   * 緩存管理器 使用Ehcache實(shí)現(xiàn) 如果使用redis則注釋下面內(nèi)容!?。?! 
   */
  @Bean
  public CacheManager getCacheShiroManager(EhCacheManagerFactoryBean ehcache) {
    EhCacheManager ehCacheManager = new EhCacheManager();
    ehCacheManager.setCacheManager(ehcache.getObject());
    return ehCacheManager;
  }



  /**
   * 項(xiàng)目自定義的Realm
   */
  @Bean
  public ShiroDbRealm shiroDbRealm() {
    return new ShiroDbRealm();
  }

  @Bean
  public ShiroTockenRealm shiroTockenRealm( ) {
    return new ShiroTockenRealm();
  }

  @Bean
  public ShiroJwtRealm shiroJwtRealm( ) {
    return new ShiroJwtRealm();
  }

  /**
   * 系統(tǒng)自帶的Realm管理,主要針對(duì)多realm
   * */
  @Bean
  public ModularRealmAuthenticator modularRealmAuthenticator(){
    ModularRealmAuthenticator modularRealmAuthenticator=new ModularRealmAuthenticator();
    modularRealmAuthenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
    return modularRealmAuthenticator;
  }
  /**
   * rememberMe管理器, cipherKey生成見(jiàn){@code Base64Test.java}
   */
  @Bean
  public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) {
    CookieRememberMeManager manager = new CookieRememberMeManager();
    manager.setCipherKey(Base64.decode("Z3VucwAAAAAAAAAAAAAAAA=="));
    manager.setCookie(rememberMeCookie);
    return manager;
  }

  /**
   * 記住密碼Cookie
   */
  @Bean
  public SimpleCookie rememberMeCookie() {
    SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
    simpleCookie.setHttpOnly(true);
    simpleCookie.setMaxAge(7 * 24 * 60 * 60);//7天
    return simpleCookie;
  }


  /**
   * 在方法中 注入 securityManager,進(jìn)行代理控制
   */
  @Bean
  public MethodInvokingFactoryBean methodInvokingFactoryBean(DefaultWebSecurityManager securityManager) {
    MethodInvokingFactoryBean bean = new MethodInvokingFactoryBean();
    bean.setStaticMethod("org.apache.shiro.SecurityUtils.setSecurityManager");
    bean.setArguments(new Object[]{securityManager});
    return bean;
  }

  /**
   * 保證實(shí)現(xiàn)了Shiro內(nèi)部lifecycle函數(shù)的bean執(zhí)行
   */
  @Bean
  public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
    return new LifecycleBeanPostProcessor();
  }

  /**
   * 啟用shrio授權(quán)注解攔截方式,AOP式方法級(jí)權(quán)限檢查
   */
  @Bean
  @DependsOn(value = "lifecycleBeanPostProcessor") //依賴其他bean的初始化
  public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
    return new DefaultAdvisorAutoProxyCreator();
  }

  @Bean
  public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
    AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor =
        new AuthorizationAttributeSourceAdvisor();
    authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
    return authorizationAttributeSourceAdvisor;
  }

}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Files和Paths的使用demo詳解

    Java Files和Paths的使用demo詳解

    Java Files和Paths是Java 7中引入的新API,用于處理文件和目錄,F(xiàn)iles類提供了許多有用的靜態(tài)方法來(lái)操作文件和目錄,而Path類則表示文件系統(tǒng)中的路徑,這篇文章主要介紹了Java Files和Paths的使用詳解,需要的朋友可以參考下
    2023-03-03
  • Spring實(shí)戰(zhàn)之屬性覆蓋占位符配置器用法示例

    Spring實(shí)戰(zhàn)之屬性覆蓋占位符配置器用法示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之屬性覆蓋占位符配置器用法,結(jié)合實(shí)例形式分析了Spring屬性覆蓋占位符配置器相關(guān)原理、配置與使用技巧,需要的朋友可以參考下
    2019-12-12
  • 簡(jiǎn)單了解JAVA構(gòu)造方法

    簡(jiǎn)單了解JAVA構(gòu)造方法

    構(gòu)造方法作用就是對(duì)類進(jìn)行初始化。 如果你沒(méi)有定議任何構(gòu)造方法的形式,程式會(huì)為你取一個(gè)不帶任何參數(shù)的構(gòu)造函數(shù),那么你產(chǎn)生類的對(duì)像時(shí)只能用不帶參數(shù)的方法.下面小編和大家來(lái)一起學(xué)習(xí)一下吧
    2019-06-06
  • springboot Mongodb的集成與使用實(shí)例詳解

    springboot Mongodb的集成與使用實(shí)例詳解

    這篇文章主要介紹了springboot Mongodb的集成與使用實(shí)例詳解,需要的朋友可以參考下
    2018-04-04
  • logback日志輸出格式設(shè)置方式

    logback日志輸出格式設(shè)置方式

    這篇文章主要介紹了logback日志輸出格式設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 基于mybatis查詢結(jié)果映射不到對(duì)象的處理

    基于mybatis查詢結(jié)果映射不到對(duì)象的處理

    這篇文章主要介紹了mybatis查詢結(jié)果映射不到對(duì)象的處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 關(guān)于java 圖形驗(yàn)證碼的解決方法

    關(guān)于java 圖形驗(yàn)證碼的解決方法

    本篇文章小編為大家介紹,在java中,使用圖形驗(yàn)證碼的解決方法。需要的朋友參考下
    2013-04-04
  • 關(guān)于maven下載慢的問(wèn)題

    關(guān)于maven下載慢的問(wèn)題

    這篇文章主要介紹了關(guān)于maven下載慢的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 在SpringBoot中集成H2數(shù)據(jù)庫(kù)的完整指南

    在SpringBoot中集成H2數(shù)據(jù)庫(kù)的完整指南

    Spring Boot是一個(gè)簡(jiǎn)化企業(yè)級(jí)Java應(yīng)用程序開(kāi)發(fā)的強(qiáng)大框架,H2數(shù)據(jù)庫(kù)是一個(gè)輕量級(jí)的、開(kāi)源的SQL數(shù)據(jù)庫(kù),非常適合用于開(kāi)發(fā)和測(cè)試,本文將指導(dǎo)您如何在Spring Boot應(yīng)用程序中集成H2數(shù)據(jù)庫(kù),并探索一些高級(jí)配置選項(xiàng),需要的朋友可以參考下
    2024-10-10
  • 深入學(xué)習(xí)java枚舉的應(yīng)用

    深入學(xué)習(xí)java枚舉的應(yīng)用

    本篇是關(guān)于java深入提高學(xué)習(xí)的相關(guān)知識(shí),介紹了枚舉的應(yīng)用等方面內(nèi)容,有興趣的朋友參考學(xué)習(xí)下吧。
    2018-01-01

最新評(píng)論

漳州市| 淄博市| 桐梓县| 铁岭县| 饶阳县| 宜黄县| 成武县| 庆城县| 黔西县| 博罗县| 鄱阳县| 锦州市| 柯坪县| 石城县| 融水| 安塞县| 新兴县| 武山县| 兰西县| 赫章县| 探索| 武山县| 海城市| 昌都县| 霍州市| 柘荣县| 罗甸县| 唐山市| 射洪县| 临桂县| 诏安县| 台州市| 肥西县| 来安县| 清丰县| 万盛区| 娄底市| 屏南县| 安图县| 肃南| 镇雄县|