锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
璇鋒敞鎰忥紒寮曠敤銆佽漿璐存湰鏂囧簲娉ㄦ槑鍘熶綔鑰咃細Rosen Jiang 浠ュ強鍑哄錛?/font>
http://m.tkk7.com/rosen
]]>
]]>
]]>
涓轟紒涓氱殑搴旂敤寮鍙戞彁渚涢氱敤鐨勩佸崟涓鐨勭粓绔敤鎴風櫥闄嗘帴鍙o紝騫朵笖騫惰綆$悊澶氱敤鎴峰笎鍙峰熀紜淇℃伅鐨勫簲鐢ㄥ紑鍙戞槸鐢變紒涓氭潵緇存姢鐨勩?BR>
鍔熻兘鐩爣
鐢ㄦ埛鐧婚檰鎺ュ彛
涓哄疄鐜扮敤鎴風櫥闄嗘帴鍙o紝XSSO 搴旇鏀寔涓嬪垪鍔熻兘鐩爣錛?BR>
鎺ュ彛搴旇涓庨獙璇佷俊鎭殑澶勭悊綾誨瀷鏃犲叧銆?BR> 鎻愪緵鏇存敼鍙楁帶鐢ㄦ埛楠岃瘉淇℃伅鐨勫姛鑳姐傝繖鎰忓懗鐫鍦ㄦ渶鍒濇洿鏀圭敤鎴峰瘑鐮佷細鍙楀埌闄愬埗錛屽綋鐒朵笉鎺掗櫎灝嗘潵瀵瑰叾鎻愪緵榪欑鍔熻兘銆?BR> 鎻愪緵涓鴻皟鐢ㄨ呭緩绔嬮粯璁ょ敤鎴峰睘鎬х殑鏀寔銆傜洰鍓嶈繕涓嶇敤浠庝竴緇勫彲鐢ㄧ殑鐢ㄦ埛灞炴ч夐」鏉ラ夋嫨榪欎簺鐢ㄦ埛灞炴э紝褰撶劧涓嶆帓闄や粖鍚庢彁渚涜繖縐嶅姛鑳姐?BR> 褰撲細璇濈粓姝€佹敞閿鏃舵彁渚涢粯璁ょ殑娓呴櫎鏈嶅姟銆?BR> 鎻愪緵涓縐嶈兘璁╄皟鐢ㄨ呴氳繃浠庨櫎璇?XSSO 瀹炵幇浠ュ鐨勫簲鐢ㄩ氱煡 XSSO 瀹炵幇鏀瑰彉鍙楁帶鐢ㄦ埛楠岃瘉淇℃伅鐨勬湇鍔°?BR> XSSO 涓嶈兘棰勫厛紜畾絎簩嬈$櫥闄嗘搷浣滅殑鏃墮棿銆?BR> 娉ㄦ剰錛氬仛涓轟富鐧婚檰鎿嶄綔錛屾剰鍛崇潃 XSSO 灝嗕笉闇瑕佹墍鏈夌櫥闄嗘搷浣滃悓鏃舵墽琛屻傝繖灝嗗鑷寸敤鎴蜂細璇濆湪鎵鏈夊彲鑳界殑鏈嶅姟涓鍒涘緩錛屽嵆渚挎煇浜涙湇鍔$敤鎴峰茍娌℃湁瀹為檯鐨勪嬌鐢ㄣ?BR>
鐢ㄦ埛甯愬彿綆$悊鎺ュ彛
涓轟簡瀹炵幇鐢ㄦ埛甯愬彿綆$悊鎺ュ彛錛孹SSO 搴旇鏀寔涓嬪垪鍔熻兘鐩爣錛?BR>
鎻愪緵鍒涘緩銆佸垹闄ゃ佷慨鏀圭敤鎴峰笎鍙風殑鍔熻兘銆?BR> 鎻愪緵涓哄崟涓敤鎴峰笎鍙瘋緗睘鎬х殑鍔熻兘銆?BR>
闈炲姛鑳芥х洰鏍?/FONT>
XSSO 鐨勯潪鍔熻兘鎬х洰鏍囧寘鎷細
XSSO 搴旇涓庨獙璇佹妧鏈棤鍏熾傛帴鍙d笉鑳芥寚瀹氫嬌鐢ㄧ壒瀹氱殑楠岃瘉鎶鏈紝涓嶆帓闄や嬌鐢ㄤ換浣曞彲鑳界殑楠岃瘉鎶鏈?nbsp;
娉ㄦ剰錛氭湁浜涢獙璇佹妧鏈紝姣斿鎸夌収鎸戞垬鍝嶅簲鏈哄埗錛岀敤鎴鋒寔鏈夌殑璁懼鏋勬垚灝嗕笉浼氬湪絎簩嬈$櫥闄嗗姩浣滄椂閫傜敤銆?BR> XSSO 搴旇涓庡鉤鍙版垨鎿嶄綔緋葷粺鏃犲叧銆備笉鎺掗櫎 XSSO 浼氶泦鎴愯繘甯歌妗岄潰鎴栧父鐢ㄦ湇鍔″櫒緋葷粺錛岀敋鑷沖ぇ鍨嬫満銆傚綋鐒訛紝涔熷彲浠ヤ慨鏀逛竴涓?XSSO 鍐嶆妸瀹冮泦鎴愯繘閭d簺妗岄潰鎴栨湇鍔″櫒緋葷粺銆?BR>
瀹夊叏鐩爣
XSSO 瀹炵幇鐨勫畨鍏ㄧ洰鏍囧涓嬶細
琚儴緗蹭箣鍚庯紝XSSO 涓嶅簲鍙嶈繃鏉ュ獎鍝嶆墍渚濊禆鐨勭郴緇熴?BR> XSSO 涓嶅簲鏈夊弽榪囨潵鍐插嚮浠諱綍鐙珛緋葷粺鏈嶅姟鐨勫彲鐢ㄦс?BR> XSSO 涓嶅簲涓哄綋浜嬩漢鎻愪緵璁塊棶鐢ㄦ埛甯愬彿淇℃伅鐨勯斿緞錛屽洜涓轟粬浠笉鍏佽璁塊棶澶勪簬鍙楁帶瀹夊叏鍩熶箣鍐呯殑閭d簺淇℃伅銆?BR> 涓涓?XSSO 瀹炵幇瑕佸鏍稿彂鐢熷湪 XSSO 涓婁笅鏂囦箣鍐呯殑鎵鏈夊畨鍏ㄧ浉鍏蟲椿鍔ㄣ?BR> 涓涓?XSSO 瀹炵幇瑕佷繚鎶ょ敱 XSSO 瀹炵幇鎻愪緵鎴栦駭鐢熺殑鎵鏈夊畨鍏ㄧ浉鍏充俊鎭紝浠ヤ究鍏朵粬鏈嶅姟鍏呭垎淇′換榪欎簺瀹夊叏淇℃伅鐨勫畬鏁存у拰鍘熷鎬э紝浠ヤ究絎簩嬈$櫥闄嗘搷浣溿?BR> 褰撳湪鍚勪釜緇勪歡鍐呴儴浠ュ強緇勪歡涓庡叾浠栨湇鍔′氦浜掓椂錛孹SSO 搴旀彁渚涘畨鍏ㄧ浉鍏充俊鎭繚鎶ゃ?BR>
鑼冨洿涔嬪
鍦ㄥ綋鍓嶇殑 XSSO 鑼冨洿涓紝浠ヤ笅榪欎簺鏂歸潰涓嶈鑰冭檻錛?BR>
鎻愪緵璺ㄨ秺浼佷笟綰х郴緇熻竟鐣岀殑鍗曠偣鐧婚檰銆?BR> 闈炵敤鎴烽厤緗獙璇佷俊鎭殑鏀瑰彉錛屼緥濡傜鎬у窘绔犮佹櫤鑳藉崱絳夌瓑銆?BR> 褰撶櫥闄嗘椂鐢ㄦ埛灞炴х殑鍙夋嫨鎬с?BR> 閰嶇疆鍜岀鐞嗙敤鎴峰睘鎬х殑鍙夐泦鍚堬紙緇勶級銆?BR> 褰撲笅闈㈢殑鐢ㄦ埛甯愬彿鍩虹淇℃伅鐢卞叾浠?XSSO 鎻愪緵鐨勫姛鑳芥墍淇敼鏃訛紝灝遍渶瑕佺淮鎶ゅ崟鐐圭櫥闄嗙敤鎴峰笎鍙峰熀紜淇℃伅浠ュ強涓嬮潰鐙珛緇存姢鐨勭敤鎴峰笎鍙峰熀紜淇℃伅鐨勫畬鏁存с?BR> 鍥懼艦鍖栧拰鍛戒護琛岀敤鎴風晫闈?XSSO 鐨勫熀紜鏈嶅姟銆傝繖涓伐鍏峰彲浠ユ槸 XSSO 鐨勪竴閮ㄥ垎銆?BR>
璇戣呮敞
鍏稿瀷鐨勬寫鎴樺搷搴旀満鍒跺簲鐢ㄥ湪 HMAC(Keyed-Hashing for Message Authentication) 楠岃瘉涓傞獙璇佹祦紼嬪涓嬶細
(1) 鍏堢敱瀹㈡埛绔悜鏈嶅姟鍣ㄥ彂鍑轟竴涓獙璇佽姹傘?
(2) 鏈嶅姟鍣ㄦ帴鍒版璇鋒眰鍚庣敓鎴愪竴涓殢鏈烘暟騫墮氳繃緗戠粶浼犺緭緇欏鎴風錛堟涓烘寫鎴橈級銆?
(3) 瀹㈡埛绔皢鏀跺埌鐨勯殢鏈烘暟鎻愪緵緇?ePass錛岀敱 ePass 浣跨敤璇ラ殢鏈烘暟涓庡瓨鍌ㄥ湪 ePass 涓殑瀵嗛挜榪涜 HMAC-MD5 榪愮畻騫跺緱鍒頒竴涓粨鏋滀綔涓鴻璇佽瘉鎹紶緇欐湇鍔″櫒錛堟涓哄搷搴旓級銆?
(4) 涓庢鍚屾椂錛屾湇鍔″櫒涔熶嬌鐢ㄨ闅忔満鏁頒笌瀛樺偍鍦ㄦ湇鍔″櫒鏁版嵁搴撲腑鐨勮瀹㈡埛瀵嗛挜榪涜 HMAC-MD5 榪愮畻錛屽鏋滄湇鍔″櫒鐨勮繍綆楃粨鏋滀笌瀹㈡埛绔紶鍥炵殑鍝嶅簲緇撴灉鐩稿悓錛屽垯璁や負瀹㈡埛绔槸涓涓悎娉曠敤鎴楓?/FONT>
璇鋒敞鎰忥紒寮曠敤銆佽漿璐存湰鏂囧簲娉ㄦ槑鍘熻瘧鑰咃細Rosen Jiang 浠ュ強鍑哄錛?/FONT>http://m.tkk7.com/rosen
閲囩敤閬椾紶鏂瑰紡鐨勭敤鎴風櫥闄嗗緋葷粺
鍦ㄥ巻鍙蹭笂錛屼竴涓垎甯冨紡璁$畻鏈虹郴緇熺敱鍚勪釜緇勪歡浣滀負鐙珛瀹夊叏鍩熻閰嶈屾垚銆傝繖浜涚粍浠剁敱鍖呭惈鍏寵仈鎿嶄綔緋葷粺鍜屽簲鐢ㄧ▼搴忕殑鐙珛騫沖彴緇勬垚銆?BR>
榪欎簺緇勪歡浣滀負瀹樿兘涓婄殑鐙珛鍩燂紝緇堢鐢ㄦ埛蹇呴』鑷繁鐙珛杈ㄥ埆鍜岄獙璇佷粬鎯寵浜や簰鐨勯偅浜涘煙銆傝鍦烘櫙鍦ㄤ笂鍥懼凡鏈夎鏄庛傜粓绔敤鎴鋒渶鍒濋氳繃鍜屼富鍩燂紙Primary Domain錛変氦浜掓潵寤虹珛浼氳瘽銆傚湪涓婂浘涓縐板仛涓誨煙鐧婚檰錛圥rimary Domain Sign-On錛夛紝騫朵笖闇瑕佺粓绔敤鎴鋒彁渚涗竴緇勫彲鐢ㄧ殑鐢ㄦ埛淇℃伅錛屼緥濡傜敤鎴峰悕鍜屽瘑鐮併備富鍩熶細璇濆吀鍨嬬殑鐢辨搷浣滅郴緇熶細璇濆澹沖湪浠h〃緇堢鐢ㄦ埛鐜鐨勭粓绔敤鎴鋒満鍣ㄤ笂榪愯鑾峰緱鐨勶紙姣斿錛氱▼搴忓睘鎬э紝鐜鍙橀噺鍜屾牴鐩綍錛夈傞氳繃涓誨煙浼氳瘽澶栧3錛岀敤鎴峰彲浠ヨ皟鐢ㄥ叾浠栫殑鍩熸湇鍔★紝姣斿騫沖彴鎴栧簲鐢ㄧ▼搴忋?BR>
瑕佽皟鐢ㄤ簩綰у煙錛圫econdary Domain錛夋湇鍔★紝緇堢鐢ㄦ埛闇瑕佽繘琛屼簩綰у煙鐧婚檰錛圫econdary Domain Sign-on錛夈傚茍瑕佹眰緇堢鐢ㄦ埛鍐嶆鎻愪緵鐢ㄦ埛淇℃伅錛岀粓绔敤鎴蜂笉寰椾笉寮曞涓涓嫭绔嬬殑鐧婚檰瀵硅瘽妗嗚繘琛岄獙璇併備簩綰у煙浼氳瘽鏄吀鍨嬬殑鎿嶄綔緋葷粺澶栧3鎴栫▼搴忓澹籌紝鍐嶄竴嬈′唬琛ㄧ粓绔敤鎴風幆澧冦備粠綆$悊鐨勮搴︿笂鐪嬶紝閲囩敤閬椾紶鏂瑰紡闇瑕佺嫭绔嬬殑綆$悊姣忎釜鍩燂紝鑰屼笖鏄鐢ㄦ埛甯愭埛綆$悊鐣岄潰銆傛潈琛″彲鐢ㄦу拰瀹夊叏涓婄殑鑰冮噺錛岄渶瑕佸湪浼佷笟涓負澶氫釜涓嶅悓鍩熼儴緗蹭竴縐嶅崗鍚屾満鍒朵互鍙婂彲闆嗘垚鐨勭敤鎴風櫥闄嗗姛鑳戒互鍙婄敤鎴峰笎鍙風鐞嗗姛鑳姐傛彁渚涜繖縐嶅崗鍚屽拰闆嗘垚鐨勬湇鍔℃湁鐩婁簬涓轟紒涓氭彁渚涚湡瀹炵殑寮閿錛岄氳繃錛?BR>
鍑忓皯鐢ㄦ埛鐧婚檰鍒扮嫭绔嬪煙鑺辮垂鐨勬搷浣滄椂闂達紝鍚屾椂涔熼檷浣庝簡榪涜鐧婚檰鎿嶄綔鏃跺け璐ョ殑鏈虹巼銆?BR> 閫氳繃鍑忓皯蹇呰鐨勭敤鎴峰彞鏌勫拰璁頒綇澶氱粍璁よ瘉娑堟伅錛屽寮轟簡瀹夊叏鎬с?BR> 鍑忓皯浜嗘椂闂寸殑鑺辮垂錛屾敼鍠勪簡鍝嶅簲錛岄氳繃緋葷粺綆$悊鍛樹負緋葷粺澧炲姞銆佸垹闄ゃ佷慨鏀圭敤鎴瘋闂潈銆?BR> 閫氳繃澧炲己緋葷粺綆$悊鍛樼淮鎶ょ敤鎴峰笎鍙烽厤緗殑瀹屾暣鎬э紝鏉ユ敼鍠勫畨鍏ㄣ傞噰鐢ㄥ崗鍚屼竴鑷寸殑鏂瑰紡紱佹鎴栧彇娑堢嫭绔嬬敤鎴瘋闂墍鏈夌郴緇熻祫婧愩?/P>
鍗曠敤鎴風櫥闄嗗埌澶氱敤鎴?/STRONG>
榪欑鏈嶅姟琚О鍋氬崟鐐圭櫥闄嗭紙Single Sign-On錛夈備笉綆℃庢牱錛岃鏈嶅姟瀵逛簬緇堢鐢ㄦ埛鍜岀鐞嗘柟闈㈤兘鍚屾牱閲嶈銆傝繖縐嶆柟寮忓湪涓婂浘涓湁鎵浣撶幇銆傚湪鍗曠偣鐧婚檰鏂瑰紡錛岀郴緇熷繀欏諱粠鐢ㄦ埛鏀墮泦鏁版嵁錛屼綔涓轟富鐧婚檰鐨勪竴閮ㄥ垎錛屾墍鏈夌殑韜喚鍜岀敤鎴蜂俊鎭繀欏繪彁渚涚粰鐢ㄦ埛楠岃瘉緋葷粺錛屼互渚挎瘡涓簩綰у煙榪涜娼滃湪鐨勪氦浜掋?BR>
榪欎簺淇℃伅鐢辯粓绔敤鎴蜂綔涓轟富鍩熺櫥闄嗚繃紼嬬殑涓閮ㄥ垎鎻愪緵錛屽彲鍦ㄤ笅闈㈠嚑涓柟闈負浜岀駭鍩熸彁渚涚櫥闄嗭細
鐩存帴鏂瑰紡錛岀敤鎴鋒彁渚涚殑淇℃伅鐩存帴浣滀負浜岀駭鍩熺殑絎簩嬈$櫥闄嗙殑涓閮ㄥ垎銆?BR> 闂存帴鏂瑰紡錛岀敤鎴鋒彁渚涚殑淇℃伅琚敤浜庢壘鍥炲瓨鍌ㄥ湪鍗曠偣鐧婚檰綆$悊鏁版嵁搴撲笂鐨勫叾浠栫敤鎴風殑鏍囪瘑鍜岀敤鎴蜂俊鎭傚彇鍥炵殑淇℃伅鎺ョ潃琚敤浜庡熀鏈殑浜岀駭鍩熺櫥闄嗘搷浣溿?BR> 绔嬪嵆鏂瑰紡錛屼笌浜岀駭鍩熷緩绔嬩細璇濅綔涓哄垵濮嬩細璇濈殑紜珛銆傛剰鍛崇潃紼嬪簭鐨勫鎴峰皢鍦ㄧ涓嬈$櫥闄嗘搷浣滄椂鍚屾椂鑷姩璋冪敤騫跺緩绔嬮氫俊銆?BR> 涓存椂瀛樺偍鎴栫紦瀛橈紝搴旂敤浜庣粓绔敤鎴峰伓灝旇姹備簩綰у煙鏈嶅姟鐨勬儏鍐點?BR>
浠庣鐞嗙殑瑙掑害鏉ョ湅錛屽崟鐐圭櫥闄嗘ā寮忔彁渚涗竴縐嶅崟涓鐢ㄦ埛綆$悊鐣岄潰錛屾墍鏈夌殑緇勪歡鍩熷皢浠ュ崗鍚屽拰鍚屾鐨勬柟寮忕鐞嗐?BR>
鍗曠偣鐧婚檰妯″紡鍦ㄥ畨鍏ㄦ柟闈㈢殑閲嶈鎰忎箟鍦ㄤ簬錛?BR>
浜岀駭鍩熶笌涓誨煙鐨勪俊浠誨叧緋伙細
姝g‘鍦版柇璦緇堢鐢ㄦ埛鐨勮韓浠藉拰楠岃瘉淇℃伅銆?BR> 淇濇姢涓轟嬌鐢ㄦ湭緇忚鍙殑浜岀駭鍩熻岄獙璇佺粓绔敤鎴瘋韓浠界殑楠岃瘉淇℃伅銆?BR>
褰撲富銆佷粠鍩熶箣闂撮氳鍙楀埌濞佽儊錛屾瘮濡備腑閫旀嫤鎴垨涓㈠け錛坋avsdropping錛夊紩璧峰彲鑳界殑浼鏀誨嚮錛岄獙璇佷俊鎭簲琚繚鎶よ搗鏉ャ?BR>
璇鋒敞鎰忥紒寮曠敤銆佽漿璐存湰鏂囧簲娉ㄦ槑鍘熻瘧鑰咃細Rosen Jiang 浠ュ強鍑哄錛?/FONT>http://m.tkk7.com/rosen
浠?/span>
Spring 1.1.1
寮濮嬶紝
EHCache
灝變綔涓轟竴縐嶉氱敤緙撳瓨瑙e喅鏂規闆嗘垚榪?/span>
Spring
銆?/span>
鎴戝皢紺鴻寖鎷︽埅鍣ㄧ殑渚嬪瓙錛屽畠鑳芥妸鏂規硶榪斿洖鐨勭粨鏋滅紦瀛樿搗鏉ャ?/span>
鍒╃敤
Spring IoC
閰嶇疆
EHCache
鍦?/span> Spring 閲岄厤緗?/span> EHCache 寰堢畝鍗曘備綘鍙渶涓涓?/span> ehcache.xml 鏂囦歡錛岃鏂囦歡鐢ㄤ簬閰嶇疆 EHCache 錛?/span>
<ehcache>
聽聽聽 <!鈥旇緗紦瀛樻枃浠?.data 鐨勫垱寤鴻礬寰勩?/font>
聽聽聽聽聽聽聽聽 濡傛灉璇ヨ礬寰勬槸 Java 緋葷粺鍙傛暟錛屽綋鍓嶈櫄鎷熸満浼氶噸鏂拌祴鍊箋?/font>
聽聽聽聽聽聽聽聽 涓嬮潰鐨勫弬鏁拌繖鏍瘋В閲婏細
聽聽聽聽聽聽聽 涓嬪垪灞炴ф槸 defaultCache 蹇呴』鐨勶細
聽聽聽聽聽聽聽 maxInMemory聽聽聽聽聽聽聽聽聽聽 - 璁懼畾鍐呭瓨涓垱寤哄璞$殑鏈澶у箋?br />聽聽聽聽聽聽聽 eternal聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 - 璁劇疆鍏冪礌錛堣瘧娉細鍐呭瓨涓璞★級鏄惁姘鎬箙椹葷暀銆傚鏋滄槸錛屽皢蹇界暐瓚?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽鏃墮檺鍒朵笖鍏冪礌姘鎬笉娑堜骸銆?br />聽聽聽聽聽聽聽 timeToIdleSeconds聽 - 璁劇疆鏌愪釜鍏冪礌娑堜骸鍓嶇殑鍋滈】鏃墮棿銆?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 涔熷氨鏄湪涓涓厓绱犳秷浜′箣鍓嶏紝涓ゆ璁塊棶鏃墮棿鐨勬渶澶ф椂闂撮棿闅斿箋?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 榪欏彧鑳藉湪鍏冪礌涓嶆槸姘鎬箙椹葷暀鏃舵湁鏁堬紙璇戞敞錛氬鏋滃璞℃案鎭掍笉鐏紝鍒?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 璁劇疆璇ュ睘鎬т篃鏃犵敤錛夈?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 濡傛灉璇ュ兼槸 0 灝辨剰鍛崇潃鍏冪礌鍙互鍋滈】鏃犵┓闀跨殑鏃墮棿銆?br />聽聽聽聽聽聽聽 timeToLiveSeconds聽- 涓哄厓绱犺緗秷浜″墠鐨勭敓瀛樻椂闂淬?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 涔熷氨鏄竴涓厓绱犱粠鏋勫緩鍒版秷浜$殑鏈澶ф椂闂撮棿闅斿箋?br />聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 榪欏彧鑳藉湪鍏冪礌涓嶆槸姘鎬箙椹葷暀鏃舵湁鏁堛?br />聽聽聽聽聽聽聽 overflowToDisk聽聽聽聽聽聽聽 - 璁劇疆褰撳唴瀛樹腑緙撳瓨杈懼埌 maxInMemory 闄愬埗鏃跺厓绱犳槸鍚﹀彲鍐欏埌紓佺洏
聽聽聽 <cache name="org.taha.cache.METHOD_CACHE"
聽
聽聽聽聽聽聽聽聽 user.home 鈥?鐢ㄦ埛涓葷洰褰?br />聽聽聽聽聽聽聽聽 user.dir聽聽聽聽聽 鈥?鐢ㄦ埛褰撳墠宸ヤ綔鐩綍
聽聽聽聽聽聽聽聽 java.io.tmpdir 鈥?榛樿涓存椂鏂囦歡璺緞 -->
聽聽聽 <diskStore path="java.io.tmpdir"/>
聽聽聽 <!鈥旂己鐪佺紦瀛橀厤緗侰acheManager 浼氭妸榪欎簺閰嶇疆搴旂敤鍒扮▼搴忎腑銆?/font>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽涓娿?br />聽聽聽聽聽聽聽 -->
聽聽聽聽聽聽聽 maxElementsInMemory="300"
聽聽聽聽聽聽聽 eternal="false"
聽聽聽聽聽聽聽 timeToIdleSeconds="500"
聽聽聽聽聽聽聽 timeToLiveSeconds="500"
聽聽聽聽聽聽聽 overflowToDisk="true"
聽聽聽聽聽聽聽 />
</ehcache>
鎷︽埅鍣ㄥ皢浣跨敤 鈥?b>org.taha.cache.METHOD_CACHE鈥? 鍖哄煙緙撳瓨鏂規硶榪斿洖緇撴灉銆備笅闈㈠埄鐢?/span> Spring IoC 璁?/span> bean 鏉ヨ闂繖涓鍖哄煙銆?/span>
<!-- ======================聽聽 緙撳瓨聽聽 ======================= -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
<bean id="methodCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
聽聽聽
聽 <property name="configLocation">
聽聽聽 <value>classpath:ehcache.xml</value>
聽 </property>
</bean>
聽 <property name="cacheManager">
聽聽聽 <ref local="cacheManager"/>
聽 </property>
聽 <property name="cacheName">
聽聽聽 <value>org.taha.cache.METHOD_CACHE</value>
聽 </property>
</bean>
鏋勫緩鎴戜滑鐨?/span>
MethodCacheInterceptor
璇ユ嫤鎴櫒瀹炵幇 org.aopalliance.intercept.MethodInterceptor 鎺ュ彛銆備竴鏃?/span> 榪愯璧鋒潵 (kicks-in) 錛屽畠棣栧厛媯鏌ヨ鎷︽埅鏂規硶鏄惁琚厤緗負鍙紦瀛樼殑銆傝繖灝嗗彲閫夋嫨鎬х殑閰嶇疆鎯寵緙撳瓨鐨?/span> bean 鏂規硶銆傚彧瑕佽皟鐢ㄧ殑鏂規硶閰嶇疆涓哄彲緙撳瓨錛屾嫤鎴櫒灝嗕負璇ユ柟娉曠敓鎴?/span> cache key 騫舵鏌ヨ鏂規硶榪斿洖鐨勭粨鏋滄槸鍚﹀凡緙撳瓨銆傚鏋滃凡緙撳瓨錛屽氨榪斿洖緙撳瓨鐨勭粨鏋滐紝鍚﹀垯鍐嶆璋冪敤琚嫤鎴柟娉曪紝騫剁紦瀛樼粨鏋滀緵涓嬫璋冪敤銆?/span>
org.taha.interceptor.MethodCacheInterceptor
/*
package org.taha.interceptor;
import java.io.Serializable;
import org.aopalliance.intercept.MethodInterceptor;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import net.sf.ehcache.Cache;
/**
聽 private Cache cache;
聽 /**
聽 /**
聽 /**
聽聽聽 logger.debug("looking for method result in cache");
聽聽聽聽聽 //cache method result
聽 /**
聽聽聽 return sb.toString();
聽
聽* Copyright 2002-2004 the original author or authors.
聽*
聽* Licensed under the Apache License, Version 2.0 (the "License");
聽* you may not use this file except in compliance with the License.
聽* You may obtain a copy of the License at
聽*
聽*聽聽聽聽聽
http://www.apache.org/licenses/LICENSE-2.0
聽*
聽* Unless required by applicable law or agreed to in writing, software
聽* distributed under the License is distributed on an "AS IS" BASIS,
聽* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
聽* See the License for the specific language governing permissions and
聽* limitations under the License.
聽*/
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.springframework.util.Assert;
import net.sf.ehcache.Element;
聽* @author <a href="
mailto:irbouh@gmail.com">Omar
Irbouh</a>
聽* @since 2004.10.07
聽*/
public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean {
聽 private static final Log logger = LogFactory.getLog(MethodCacheInterceptor.class);
聽聽 * 璁劇疆緙撳瓨鍚?br />聽聽 */
聽 public void setCache(Cache cache) {
聽聽聽 this.cache = cache;
聽 }
聽聽 * 媯鏌ユ槸鍚︽彁渚涘繀瑕佸弬鏁般?br />聽聽 */
聽 public void afterPropertiesSet() throws Exception {
聽聽聽 Assert.notNull(cache, "A cache is required. Use setCache(Cache) to provide one.");
聽 }
聽聽 * 涓繪柟娉?br />聽聽 * 濡傛灉鏌愭柟娉曞彲琚紦瀛樺氨緙撳瓨鍏剁粨鏋?br />聽聽 * 鏂規硶緇撴灉蹇呴』鏄彲搴忓垪鍖栫殑(serializable)
聽聽 */
聽 public Object invoke(MethodInvocation invocation) throws Throwable {
聽聽聽 String targetName聽 = invocation.getThis().getClass().getName();
聽聽聽 String methodName聽 = invocation.getMethod().getName();
聽聽聽 Object[] arguments = invocation.getArguments();
聽聽聽 Object result;
聽聽聽 String cacheKey = getCacheKey(targetName, methodName, arguments);
聽聽聽 Element element = cache.get(cacheKey);
聽聽聽 if (element == null) {
聽聽聽聽聽 //call target/sub-interceptor
聽聽聽聽聽 logger.debug("calling intercepted method");
聽聽聽聽聽 result = invocation.proceed();
聽聽聽聽聽 logger.debug("caching result");
聽聽聽聽聽 element = new Element(cacheKey, (Serializable) result);
聽聽聽聽聽 cache.put(element);
聽聽聽 }
聽聽聽 return element.getValue();
聽 }
聽聽 * creates cache key: targetName.methodName.argument0.argument1...
聽聽 */
聽 private String getCacheKey(String targetName,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 String methodName,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 Object[] arguments) {
聽聽聽 StringBuffer sb = new StringBuffer();
聽聽聽 sb.append(targetName)
聽聽聽聽聽 .append(".").append(methodName);
聽聽聽 if ((arguments != null) && (arguments.length != 0)) {
聽聽聽聽聽 for (int i=0; i<arguments.length; i++) {
聽聽聽聽聽聽聽 sb.append(".")
聽聽聽聽聽聽聽聽聽 .append(arguments[i]);
聽聽聽聽聽 }
聽聽聽 }
聽 }
}
MethodCacheInterceptor
浠g爜璇存槑浜嗭細
浣跨敤
MethodCacheInterceptor
涓嬮潰鎽樺綍浜嗘庢牱閰嶇疆 MethodCacheInterceptor 錛?/span>
<bean id="methodCacheInterceptor" class="org.taha.interceptor.MethodCacheInterceptor">
<bean id="methodCachePointCut" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<bean id="myBean" class="org.springframework.aop.framework.ProxyFactoryBean">
聽 <property name="cache">
聽聽聽 <ref local="methodCache" />
聽 </property>
</bean>
聽 <property name="advice">
聽聽聽 <ref local="methodCacheInterceptor"/>
聽 </property>
聽 <property name="patterns">
聽聽聽 <list>
聽聽聽聽聽 <value>.*methodOne</value>
聽聽聽聽聽 <value>.*methodTwo</value>
聽聽聽 </list>
聽 </property>
</bean>
聽 <property name="target">
聽聽 <bean class="org.taha.beans.MyBean"/>
聽 </property>
聽 <property name="interceptorNames">
聽聽聽 <list>
聽聽聽聽聽 <value>methodCachePointCut</value>
聽聽聽 </list>
聽 </property>
</bean>
璇戞敞
濡傛灉浣犺緙撳瓨鐨勬柟娉曟槸 findXXX錛岄偅涔堟鍒欒〃杈懼紡搴旇榪欐牱鍐欙細鈥?*find.*鈥濄?br />
澶忔槙鎵钁椼?/span>
Hibernate
寮鍙戞寚鍗椼嬶紝鍏朵腑浠栬繖鏍鋒弿榪?/span>
EHCache
閰嶇疆鏂囦歡鐨勶細
聽
<ehcache>
聽聽聽 <diskStore path="java.io.tmpdir"/>
聽聽聽 <defaultCache
聽聽聽聽聽聽聽 maxElementsInMemory="10000" //Cache涓渶澶у厑璁鎬繚瀛樼殑鏁版嵁鏁伴噺
聽聽聽聽聽聽聽 eternal="false"聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 聽//Cache涓暟鎹槸鍚︿負甯擱噺
聽聽聽聽聽聽聽 timeToIdleSeconds="120"聽聽聽聽 //緙撳瓨鏁版嵁閽濆寲鏃墮棿
聽聽聽聽聽聽聽 timeToLiveSeconds="120"聽聽聽聽 //緙撳瓨鏁版嵁鐨勭敓瀛樻椂闂?br />聽聽聽聽聽聽聽 overflowToDisk="true"聽聽聽聽聽聽 //鍐呭瓨涓嶈凍鏃訛紝鏄惁鍚敤紓佺洏緙撳瓨
聽聽聽 />
</ehcache>
璇鋒敞鎰忥紒寮曠敤銆佽漿璐存湰鏂囧簲娉ㄦ槑鍘熻瘧鑰咃細Rosen Jiang 浠ュ強鍑哄錛?/font>http://m.tkk7.com/rosen