jfinal 使用ehcache 存儲登錄信息

    今天接觸了下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仍是挺不錯的,對於我這種菜鳥都能很好的上手,配置相應的東西也挺簡單的,但願之後真的能普遍應用,哈哈。。。

相關文章
相關標籤/搜索