今天接觸了下EhCache 緩存機制,嘗試着用jfinal實現了登錄成功後緩存用戶對象。有問題還請你們指正。php
第一步:配置環境html
建立一個web工程,先把jfinal相關配置完成,能夠直接用jfinal的demo(連jfinal的demo都沒有?在osc搜索下吧)。下載ehcache.jar ,commons-logging.jar ,log4j-1.2.16.jar 把三個jar包放在WEB-INF/lib 下,找了半天沒找到如何共享jar包,你們只有本身去下載了。給個連接http://sourceforge.net/project/showfiles.php?group_id=93232 java
第二步:建立ehcache.xml web
建立ehcache.xml文件,放在src便可。相關配置文件參數的介紹你們能夠看下緩存
<diskStore>元素:指定一個文件目錄,當EHCache把數據寫到硬盤上時,將把數據寫到這個文件目錄下。 下面的參數這樣解釋:spa
user.home – 用戶主目錄.net
user.dir – 用戶當前工做目錄插件
java.io.tmpdir – 默認臨時文件路徑code
<defaultCache>元素:設定緩存的默認數據過時策略。xml
<cache>元素:設定具體的命名緩存的數據過時策略。
<cache>元素的屬性
name:緩存名稱。一般爲緩存對象的類名(非嚴格標準)。
maxElementsInMemory:設置基於內存的緩存可存放對象的最大數目。
maxElementsOnDisk:設置基於硬盤的緩存可存放對象的最大數目。
eternal:若是爲true,表示對象永遠不會過時,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認爲false;
timeToIdleSeconds:
設定容許對象處於空閒狀態的最長時間,以秒爲單位。當對象自從最近一次被訪問後,若是處於空閒狀態的時間超過了timeToIdleSeconds屬性
值,這個對象就會過時。當對象過時,EHCache將把它從緩存中清空。只有當eternal屬性爲false,該屬性纔有效。若是該屬性值爲0,則表示
對象能夠無限期地處於空閒狀態。
timeToLiveSeconds:設定對象容許存在於緩存中的最長時間,以秒爲單位。當對象自從被存放到緩存中後,若是處於緩存中的時間超過了
timeToLiveSeconds屬性值,這個對象就會過時。當對象過時,EHCache將把它從緩存中清除。只有當eternal屬性爲false,
該屬性纔有效。若是該屬性值爲0,則表示對象能夠無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds
屬性,纔有意義。
overflowToDisk:若是爲true,表示當基於內存的緩存中的對象數目達到了maxElementsInMemory界限後,會把益出
的對象寫到基於硬盤的緩存中。注意:若是緩存的對象要寫入到硬盤中的話,則該對象必須實現了Serializable接口才行。
memoryStoreEvictionPolicy:緩存對象清除策略。有三種:
1 、FIFO ,first in first out ,這個是你們最熟的,先進先出,很少講了
2 、LFU , Less Frequently Used ,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit 屬性,hit 值最小的將會被清出緩存。
三、 LRU ,Least Recently Used ,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又須要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。
個人ehcache.xml配置以下:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <diskStore path="java.io.tmpdir"/> <!-- --> <defaultCache maxElementsInMemory="10000" eternal="true" timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="true" /> <!-- 自定義cache --> <cache name="UserCachingFilter" maxElementsInMemory="10000" maxElementsOnDisk="1000" eternal="false" overflowToDisk="true" timeToIdleSeconds="900" timeToLiveSeconds="1800" memoryStoreEvictionPolicy="LFU" /> </ehcache>
第三步:在jfinal中加入ehcache插件
在jfinal配置類中加入該插件便可,注意ehcache.xml文件的路徑。
plugins.add(new EhCachePlugin("src/ehcache.xml"));
第四步:建立驗證邏輯
直接貼我login方法,很簡單,一看就懂。
public void login(){ String username=getPara("username"); String pwd=getPara("pwd"); User user=User.userDao.findFirst("select * from m_user where name=? and pwd=?", username,pwd); if(null!=user){//驗證成功 //CacheKit操做cache把user加入到緩存中 CacheKit.put("UserCachingFilter", "user", user); forwardAction("/menu"); }else{ setAttr("loginError", "帳號或密碼錯誤"); render("/login.html"); }
第五步:登錄攔截
建立一個登錄攔截器,而後你就能夠在任何地方攔截啦。我發現即便不在配置類中配置攔截器,也能夠用。
public void intercept(ActionInvocation ai) { System.out.println("user interceptor is running...."); User user=CacheKit.get("UserCachingFilter", "user"); if(null==user){ //若是用戶爲空則跳轉登錄,固然還能夠進一步的操做 ai.getController().render("/login.html"); }else{ ai.invoke(); } }
ps:感受jfinal仍是挺不錯的,對於我這種菜鳥都能很好的上手,配置相應的東西也挺簡單的,但願之後真的能普遍應用,哈哈。。。