在Servlet中,Session和Cookie是分開的。Session1般保存在內存中,固然也能夠保存在數據庫等其他地方。如果保存在內存中,對服務集群來講就需要解決Session同享的問題。如果保存在數據庫,就存在單點故障、性能差等問題。
webx提供了會話框架,將session這樣復雜的問題統1進行解決。在webx框架中,主張將cookie合并到session中,再通過規則,路由到cookie或session中。cookie保存在客戶端,session保存在服務端,它們的區分這里就不贅述了。
webx中有1個SessionStore的概念。它相當于Session的保存容器。容器可以配置不同的編碼、加密方式等。與servlet配置類似,session
的配置有stores
和store-mappings
。下面是1個簡單的例子(僅用于調試):
SessionID
。在Servlet中,默許是通過名為JSESSIONID的Cookie保存SessionID。在webx中可以換用不同的Cookie名稱,而且SessionID
的生成方法也能夠改變。下面是改變SessionID
字段的例子。
Cookie屬性有下面幾個,都可以通過屬性進行設置。name
,domain
,maxAge
,path
,httpOnly
,secure
。
與其他框架不同的是,如果Http要求中的SessionID
不認識,之前沒有出現過,那末會將HTTP要求中的SessionID
作為該客戶真個SessionID
,而不是創建1個新的。這樣設計的好處是,有可能SessionID
與其他利用同享,其他利用生成的SessionID
是不能覆蓋的。
會話RequestContext的屬性有以下幾個。
屬性 | 作用 |
---|---|
maxInactiveInterval |
Session的失效時間 |
keepInTouch |
默許為false 。如果為true ,表示和servlet中的session模式1樣,每次讀取session的時候更新session,如果為false ,只有在session內容產生改變時才更新session時間。 |
forceExpirationPeriod |
疏忽失效時間,即便這個session1直被訪問,超過這個事件,session還是會失效 |
modelKey |
用于保存session狀態的對象名稱,1般不需要修改。默許為SESSION_MODEL 。 |
SessionStore
。下面是SessionStore
的1個例子。
match
標簽采取了正則匹配,如果有多個規則符合正則表達式,那末有下面的優先級:
regex
優先*
默許規則只能有1個。
SessionModel
。它是1個寄存在Session中的字段,用于記錄Session中各個字段的生命周期數據,比如創建時間,最后更新時間等。它可以看成1個普通的session字段,因此可以配置匹配規則,放到指定的session容器中。
SessionModel
可以轉換成字符串,默許是轉換成json,并作為普通的字段保存到session中。
Session攔截器。框架提供了兩個自帶的攔截器:lifecycle-logger
和attribute-whitelist
,它們的用法在下面這個例子中已非常清楚了。固然也能夠定義自己的攔截器,有兩種攔截器可以選擇:
SessionLifecycleListener
:監聽Session的生成、燒毀、訪問事件。SessionAttributeInterceptor
:監聽Session的讀寫事件。
框架會根據基類自動配置不同的攔截器。
CookieStore
。有些安全性要求不高的session字段沒必要保存在服務端,而是保存在閱讀器端。這樣對服務器的壓力也會小1些。
Cookie中只能寄存字符串,而session中可以寄存java對象,因此對接cookie和session需要將Java對象轉換成字符串。這類轉換交給encoder
進行。配置方法以下:
可以指定多個encoder
,寫入session時,使用第1個encoder
進行編碼,讀取session時,順次使用不同的解碼器進行解碼,直到正確解碼為止。
框架自帶了幾個編碼器,默許使用hessian進行編碼。
編碼后加密。
上一篇 互聯網思維,改變未來的武器