SpringBoot + Shiro (四)緩存&記住密碼

最終demo

到這節(jié)為止,我們已經(jīng)實現(xiàn)了身份驗證和權限驗證蔑歌。但是伞芹,如果我們登錄之后多次訪問http://localhost:8080/userInfo/userDel的話可柿,會發(fā)現(xiàn)權限驗證會每次都執(zhí)行一次怯邪。這是有問題的绊寻,因為像用戶的權限這些我們提供給shiro一次就夠了。

下面,我們開始給shiro添加緩存支持:

1.添加依賴

        <!-- shiro ehcache -->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-ehcache</artifactId>
            <version>1.2.2</version>
        </dependency>

        <!--
           包含支持UI模版(Velocity澄步,F(xiàn)reeMarker冰蘑,JasperReports),
           郵件服務驮俗,
           腳本服務(JRuby)懂缕,
           緩存Cache(EHCache),
           任務計劃Scheduling(uartz)王凑。
        -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>

2.注入緩存

com.example.demo.config.Shiro.ShiroConfiguration中添加以下方法。

    @Bean
    public EhCacheManager ehCacheManager() {
        System.out.println("ShiroConfiguration.getEhCacheManager()");
        EhCacheManager ehCacheManager = new EhCacheManager();
        ehCacheManager.setCacheManagerConfigFile("classpath:config/ehcache-shiro.xml");
        return ehCacheManager;
    }

將緩存對象注入到SecurityManager中:

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myShiroRealm());
        securityManager.setCacheManager(ehCacheManager()); //注入緩存對象聋丝。
        return securityManager;
    }

3.添加配置文件

在src/main/resouces/config中添加ehcache-shiro.xml配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache name="es">

    <diskStore path="java.io.tmpdir"/>

    <!--
       name:緩存名稱索烹。
       maxElementsInMemory:緩存最大數(shù)目
       maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。
       eternal:對象是否永久有效弱睦,一但設置了百姓,timeout將不起作用。
       overflowToDisk:是否保存到磁盤况木,當系統(tǒng)當機時
       timeToIdleSeconds:設置對象在失效前的允許閑置時間(單位:秒)垒拢。僅當eternal=false對象不是永久有效時使用,可選屬性火惊,默認值是0求类,也就是可閑置時間無窮大。
       timeToLiveSeconds:設置對象在失效前允許存活時間(單位:秒)屹耐。最大時間介于創(chuàng)建時間和失效時間之間尸疆。僅當eternal=false對象不是永久有效時使用,默認是0.惶岭,也就是對象存活時間無窮大寿弱。
       diskPersistent:是否緩存虛擬機重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
       diskSpoolBufferSizeMB:這個參數(shù)設置DiskStore(磁盤緩存)的緩存區(qū)大小。默認是30MB按灶。每個Cache都應該有自己的一個緩沖區(qū)症革。
       diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒鸯旁。
       memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時噪矛,Ehcache將會根據(jù)指定的策略去清理內(nèi)存。默認策略是LRU(最近最少使用)羡亩。你可以設置為FIFO(先進先出)或是LFU(較少使用)摩疑。
        clearOnFlush:內(nèi)存數(shù)量最大時是否清除。
         memoryStoreEvictionPolicy:
            Ehcache的三種清空策略;
            FIFO畏铆,first in first out雷袋,這個是大家最熟的,先進先出。
            LFU楷怒, Less Frequently Used蛋勺,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的鸠删。如上面所講抱完,緩存的元素有一個hit屬性,hit值最小的將會被清出緩存刃泡。
            LRU巧娱,Least Recently Used,最近最少使用的烘贴,緩存的元素有一個時間戳禁添,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候桨踪,那么現(xiàn)有緩存元素中時間戳離當前時間最遠的元素將被清出緩存老翘。
    -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
    />


    <!-- 登錄記錄緩存鎖定10分鐘 -->
    <cache name="passwordRetryCache"
           maxEntriesLocalHeap="2000"
           eternal="false"
           timeToIdleSeconds="3600"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           statistics="true">
    </cache>

</ehcache>

啟動項目,再多次訪問http://localhost:8080/userInfo/userDel锻离,這時候只會在后臺打印一次配置權限的信息了铺峭,說明shiro緩存起了作用。

---------------------下面我們開始配置記住密碼-----------

1.在com.example.demo.config.Shiro.ShiroConfiguration中加入下面兩個方法:

    //cookie對象;
    @Bean
    public SimpleCookie rememberMeCookie() {
        System.out.println("ShiroConfiguration.rememberMeCookie()");
        //這個參數(shù)是cookie的名稱汽纠,對應前端的checkbox的name = rememberMe
        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");

        //<!-- 記住我cookie生效時間30天 ,單位秒;-->
        simpleCookie.setMaxAge(259200);
        return simpleCookie;
    }

    //cookie管理對象;
    @Bean
    public CookieRememberMeManager cookieRememberMeManager() {
        System.out.println("ShiroConfiguration.rememberMeManager()");
        CookieRememberMeManager manager = new CookieRememberMeManager();
        manager.setCookie(rememberMeCookie());
        return manager;
    }

將rememberMeManager注入到SecurityManager中

@Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myShiroRealm());
        securityManager.setCacheManager(ehCacheManager());
        securityManager.setRememberMeManager(cookieRememberMeManager()); //注入rememberMeManager;
        return securityManager;
    }

ShiroFilterFactoryBean中添加記住我過濾器user卫键,添加user過濾器的資源在記住我或認證之后就可以直接訪問了。

Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
...
        filterChainDefinitionMap.put("/index", "user");
        filterChainDefinitionMap.put("/", "user");
....

最后疏虫,在login.html頁面添加記住我單選框

<P><input type="checkbox" name="rememberMe" />記住我</P>

啟動項目永罚,正常登錄后關閉瀏覽器,再打開瀏覽器輸入http://localhost:8080/index卧秘,這時候就可以直接訪問index頁面呢袱,不需要再登錄了。

SpringBoot + Shiro (一)基礎工程搭建
SpringBoot + Shiro (二)身份校驗和角色設置
SpringBoot + Shiro (三)權限
SpringBoot + Shiro (四)緩存&記住密碼
SpringBoot + Shiro (五)驗證碼

最后翅敌,感謝幾位作者的文章解惑:
springboot整合shiro-登錄認證和權限管理
Spring Boot Shiro權限管理【從零開始學Spring Boot】
Spring boot 中使用Shiro


最后幫朋友打個小廣告

一個有趣的迷你小程序

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末羞福,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蚯涮,更是在濱河造成了極大的恐慌治专,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遭顶,死亡現(xiàn)場離奇詭異张峰,居然都是意外死亡,警方通過查閱死者的電腦和手機棒旗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門喘批,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事饶深〔筒埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵敌厘,是天一觀的道長台猴。 經(jīng)常有香客問我,道長俱两,這世上最難降的妖魔是什么饱狂? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮锋华,結果婚禮上嗡官,老公的妹妹穿的比我還像新娘。我一直安慰自己毯焕,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布磺樱。 她就那樣靜靜地躺著纳猫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪竹捉。 梳的紋絲不亂的頭發(fā)上芜辕,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音块差,去河邊找鬼侵续。 笑死,一個胖子當著我的面吹牛憨闰,可吹牛的內(nèi)容都是我干的状蜗。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鹉动,長吁一口氣:“原來是場噩夢啊……” “哼轧坎!你這毒婦竟也來了?” 一聲冷哼從身側響起泽示,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤缸血,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后械筛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捎泻,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年埋哟,在試婚紗的時候發(fā)現(xiàn)自己被綠了笆豁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渔呵,靈堂內(nèi)的尸體忽然破棺而出怒竿,到底是詐尸還是另有隱情,我是刑警寧澤扩氢,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布耕驰,位于F島的核電站,受9級特大地震影響录豺,放射性物質(zhì)發(fā)生泄漏朦肘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一双饥、第九天 我趴在偏房一處隱蔽的房頂上張望媒抠。 院中可真熱鬧,春花似錦咏花、人聲如沸趴生。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苍匆。三九已至,卻和暖如春棚菊,著一層夾襖步出監(jiān)牢的瞬間浸踩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工统求, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留检碗,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓码邻,卻偏偏與公主長得像折剃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冒滩,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理微驶,服務發(fā)現(xiàn),斷路器开睡,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • Apache Shiro是Java的一個安全框架因苹。功能強大,使用簡單的Java安全框架篇恒,它為開發(fā)人員提供一個直觀而...
    意識流丶閱讀 4,239評論 0 7
  • shiro是一個權限框架,具體的使用可以查看其官網(wǎng)官網(wǎng)地址:https://shiro.apache.org/Sh...
    意識流丶閱讀 20,325評論 19 26
  • 爬過奇險峻峭的高山胁艰,趟過蜿蜒曲折的小溪款筑,登過氧氣稀薄的雪山智蝠,游過清澈無痕的湖泊,這一次奈梳,終于來到了沙漠杈湾,可謂...
    妖精小湫閱讀 336評論 0 0