锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 聽聽聽聽聽聽聽聽 2.1 鍦╓eb.xml涓殑閰嶇疆 1)聽 FilterToBeanProxy 2) filter-mapping 3) HttpSessionEventPublisher 銆銆FilterChainProxy浼氭寜欏哄簭鏉ヨ皟鐢ㄨ繖浜沠ilter,浣胯繖浜沠ilter鑳戒韓鐢⊿pring ioc鐨勫姛鑳? CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON瀹氫箟浜唘rl姣旇緝鍓嶅厛杞負灝忓啓錛?PATTERN_TYPE_APACHE_ANT瀹氫箟浜嗕嬌鐢ˋpache ant鐨勫尮閰嶆ā寮? 1) authenticationManager 聽聽聽聽聽聽聽 姣忎釜璁よ瘉鑰呬細瀵硅嚜宸辨寚瀹氱殑璇佹槑淇℃伅榪涜璁よ瘉錛屽DaoAuthenticationProvider浠呭UsernamePasswordAuthenticationToken榪欎釜璇佹槑淇℃伅榪涜璁よ瘉銆?/p>
5) userCache銆&聽 resourceCache
7) basicProcessingFilterEntryPoint 8) authenticationProcessingFilterEntryPoint 1) httpSessionContextIntegrationFilter
4錛?strong>exceptionTranslationFilter 5) authenticationProcessingFilter 6) filterInvocationInterceptor
(璇﹁ 2.6.3 璧勬簮鏉冮檺瀹氫箟鎵╁睍) 1) methodSecurityInterceptor 閲囩敤 http://jcaptcha.sourceforge.net聽浣滀負閫氱敤鐨勯獙璇佺爜鏂規(guī)錛岃鍙傝僑pringSide涓殑渚嬪瓙錛屾垨緗戜笂鐨勶細 宸矙鍦ㄦ榪囩▼涓張鍙戠幇acegi logout filter鐨勯敊璇紝榪涜浜嗕慨姝c?/p>
鍙﹀瀹冮粯璁ゆ彁渚涚殑鍥劇墖姣旇緝闅捐錛屾垜浠琧ustom浜嗕竴涓編瑙備竴鐐圭殑鐗堟湰銆?/p>
]]>
Acegi 鐨勯厤緗湅璧鋒潵闈炲父澶嶆潅,浣嗕簨瀹炰笂鍦ㄥ疄闄呴」鐩殑瀹夊叏搴旂敤涓垜浠茍涓嶉渶瑕侀偅涔堝鍔熻兘,娓呮鐨勪簡瑙cegi閰嶇疆涓悇欏圭殑鍔熻兘錛屾湁鍔╀簬鎴戜滑鐏墊椿鐨勮繍鐢ˋcegi浜庡疄璺典腑銆?/p>
銆銆Acegi閫氳繃瀹炵幇浜咶ilter鎺ュ彛鐨凢ilterToBeanProxy鎻愪緵涓縐嶇壒孌婄殑浣跨敤Servlet Filter鐨勬柟寮忥紝瀹冨鎵楽pring涓殑Bean -- FilterChainProxy鏉ュ畬鎴愯繃婊ゅ姛鑳斤紝榪欏ソ澶勬槸綆鍖栦簡web.xml鐨勯厤緗紝騫朵笖鍏呭垎鍒╃敤浜哠pring IOC鐨勪紭鍔褲侳ilterChainProxy鍖呭惈浜嗗鐞嗚璇佽繃紼嬬殑filter鍒楄〃錛屾瘡涓猣ilter閮芥湁鍚勮嚜鐨勫姛鑳姐?/p>
聽 聽 <filter>
聽聽聽聽聽聽聽 <filter-name>Acegi Filter Chain Proxy</filter-name>
聽聽聽聽聽聽聽 <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
聽聽聽聽聽聽聽 <init-param>
聽聽聽聽聽聽聽聽聽聽聽 <param-name>targetClass</param-name>
聽聽聽聽聽聽聽聽聽聽聽 <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
聽聽聽聽聽聽聽 </init-param>
聽聽聽 </filter>
銆銆<filter-mapping>闄愬畾浜咶ilterToBeanProxy鐨刄RL鍖歸厤妯″紡,鍙湁*.do鍜?.jsp鍜?j_acegi_security_check 鐨勮姹傛墠浼氬彈鍒版潈闄愭帶鍒訛紝瀵筳avascript,css絳変笉闄愬埗銆?/p>
聽聽 <filter-mapping>
聽聽聽聽聽 <filter-name>Acegi Filter Chain Proxy</filter-name>
聽聽聽聽聽 <url-pattern>*.do</url-pattern>
聽聽聽 </filter-mapping>
聽聽聽
聽聽聽 <filter-mapping>
聽聽聽聽聽 <filter-name>Acegi Filter Chain Proxy</filter-name>
聽聽聽聽聽 <url-pattern>*.jsp</url-pattern>
聽聽聽 </filter-mapping>
聽聽聽
聽聽聽 <filter-mapping>
聽聽聽聽聽 <filter-name>Acegi Filter Chain Proxy</filter-name>
聽聽聽聽聽 <url-pattern>/j_acegi_security_check</url-pattern>
</filter-mapping>
銆銆<listener>鐨凥ttpSessionEventPublisher鐢ㄤ簬鍙戝竷HttpSessionApplicationEvents鍜孒ttpSessionDestroyedEvent浜嬩歡緇檚pring鐨刟pplicationcontext銆?/p>
聽聽聽 <listener>
聽聽聽聽聽聽聽 <listener-class>org.acegisecurity.ui.session.HttpSessionEventPublisher</listener-class>
聽聽聽 </listener>
2.2 鍦╝pplicationContext-acegi-security.xml涓?/h2>
2.2.1 FILTER CHAIN
<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
聽聽聽聽聽聽聽 <property name="filterInvocationDefinitionSource">
聽聽聽聽聽聽聽聽聽聽聽 <value>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 PATTERN_TYPE_APACHE_ANT
聽聽聽聽聽聽聽聽聽聽聽聽聽聽 /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,
basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,
exceptionTranslationFilter,filterInvocationInterceptor
聽聽聽聽聽聽聽聽聽聽聽 </value>
聽聽聽聽聽聽聽 </property>
聽聽聽 </bean>2.2.2 鍩虹璁よ瘉
銆銆璧峰埌璁よ瘉綆$悊鐨勪綔鐢紝瀹冨皢楠岃瘉鐨勫姛鑳藉鎵樼粰澶氫釜Provider錛屽茍閫氳繃閬嶅巻Providers, 浠ヤ繚璇佽幏鍙栦笉鍚屾潵婧愮殑韜喚璁よ瘉錛岃嫢鏌愪釜Provider鑳芥垚鍔熺‘璁ゅ綋鍓嶇敤鎴風殑韜喚錛宎uthenticate()鏂規(guī)硶浼氳繑鍥炰竴涓畬鏁寸殑鍖呭惈鐢ㄦ埛鎺堟潈淇℃伅鐨凙uthentication瀵硅薄錛屽惁鍒欎細鎶涘嚭涓涓狝uthenticationException銆?br />Acegi鎻愪緵浜嗕笉鍚岀殑AuthenticationProvider鐨勫疄鐜?濡傦細
聽聽聽聽聽聽聽 DaoAuthenticationProvider 浠庢暟鎹簱涓鍙栫敤鎴蜂俊鎭獙璇佽韓浠?br />聽聽聽聽聽聽聽 AnonymousAuthenticationProvider 鍖垮悕鐢ㄦ埛韜喚璁よ瘉
聽聽聽聽聽聽聽 RememberMeAuthenticationProvider 宸插瓨cookie涓殑鐢ㄦ埛淇℃伅韜喚璁よ瘉
聽聽聽聽聽聽聽 AuthByAdapterProvider 浣跨敤瀹瑰櫒鐨勯傞厤鍣ㄩ獙璇佽韓浠?br />聽聽聽聽聽聽聽 CasAuthenticationProvider 鏍規(guī)嵁Yale涓績璁よ瘉鏈嶅姟楠岃瘉韜喚, 鐢ㄤ簬瀹炵幇鍗曠偣鐧婚檰
聽聽聽聽聽聽聽 JaasAuthenticationProvider 浠嶫ASS鐧婚檰閰嶇疆涓幏鍙栫敤鎴蜂俊鎭獙璇佽韓浠?br />聽聽聽聽聽聽聽 RemoteAuthenticationProvider 鏍規(guī)嵁榪滅▼鏈嶅姟楠岃瘉鐢ㄦ埛韜喚
聽聽聽聽聽聽聽 RunAsImplAuthenticationProvider 瀵硅韓浠藉凡琚鐞嗗櫒鏇挎崲鐨勭敤鎴瘋繘琛岄獙璇?br />聽聽聽聽聽聽聽 X509AuthenticationProvider 浠嶺509璁よ瘉涓幏鍙栫敤鎴蜂俊鎭獙璇佽韓浠?br />聽聽聽聽聽聽聽 TestingAuthenticationProvider 鍗曞厓嫻嬭瘯鏃朵嬌鐢?/p>
<bean id="authenticationManager" class="org.acegisecurity.providers.ProviderManager">
聽聽聽聽聽聽聽 <property name="providers">
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <ref local="daoAuthenticationProvider"/>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <ref local="anonymousAuthenticationProvider"/>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <ref local="rememberMeAuthenticationProvider"/>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽 </property>
</bean>
2) daoAuthenticationProvider
銆銆榪涜綆鍗曠殑鍩轟簬鏁版嵁搴撶殑韜喚楠岃瘉銆侱aoAuthenticationProvider鑾峰彇鏁版嵁搴撲腑鐨勮處鍙峰瘑鐮佸茍榪涜鍖歸厤錛岃嫢鎴愬姛鍒欏湪閫氳繃鐢ㄦ埛韜喚鐨勫悓鏃惰繑鍥炰竴涓寘鍚巿鏉冧俊鎭殑Authentication瀵硅薄錛屽惁鍒欒韓浠介獙璇佸け璐ワ紝鎶涘嚭涓涓狝uthenticatiionException銆?/p>
聽聽聽 <bean id="daoAuthenticationProvider" class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
聽聽聽聽聽聽聽 <property name="userDetailsService" ref="jdbcDaoImpl"/>
聽聽聽聽聽聽聽 <property name="userCache" ref="userCache"/>
聽聽聽聽聽聽聽 <property name="passwordEncoder" ref="passwordEncoder"/>
聽聽 </bean>
3) passwordEncoder
銆銆浣跨敤鍔犲瘑鍣ㄥ鐢ㄦ埛杈撳叆鐨勬槑鏂囪繘琛屽姞瀵嗐侫cegi鎻愪緵浜嗕笁縐嶅姞瀵嗗櫒:
PlaintextPasswordEncoder鈥旈粯璁わ紝涓嶅姞瀵嗭紝榪斿洖鏄庢枃.
ShaPasswordEncoder鈥斿搱甯岀畻娉?SHA)鍔犲瘑
Md5PasswordEncoder鈥旀秷鎭憳瑕?MD5)鍔犲瘑<bean id="passwordEncoder" class="org.acegisecurity.providers.encoding.Md5PasswordEncoder"/>
4) jdbcDaoImpl
銆銆鐢ㄤ簬鍦ㄦ暟鎹腑鑾峰彇鐢ㄦ埛淇℃伅銆?acegi鎻愪緵浜嗙敤鎴峰強鎺堟潈鐨勮〃緇撴瀯錛屼絾鏄?zhèn)ㄤ篃鍙互鑷繁鏉ュ疄鐜般傞氳繃usersByUsernameQuery榪欎釜SQL寰楀埌浣犵殑(鐢ㄦ埛ID,瀵嗙爜,鐘舵佷俊鎭?;閫氳繃authoritiesByUsernameQuery榪欎釜SQL寰楀埌浣犵殑(鐢ㄦ埛ID,鎺堟潈淇℃伅) <bean id="jdbcDaoImpl" class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
聽聽聽聽聽聽聽 <property name="dataSource" ref="dataSource"/>
聽聽聽聽聽聽聽 <property name="usersByUsernameQuery">
聽聽聽聽聽聽聽聽聽聽聽 <value>select loginid,passwd,1 from users where loginid = ?</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="authoritiesByUsernameQuery">
聽聽聽聽聽聽聽聽聽聽聽 <value>select u.loginid,p.name from users u,roles r,permissions p,user_role ur,role_permis rp where u.id=ur.user_id and r.id=ur.role_id and p.id=rp.permis_id and
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 r.id=rp.role_id and p.status='1' and u.loginid=?</value>
聽聽聽聽聽聽聽 </property>
</bean>
銆銆緙撳瓨鐢ㄦ埛鍜岃祫婧愮浉瀵瑰簲鐨勬潈闄愪俊鎭傛瘡褰撹姹備竴涓彈淇濇姢璧勬簮鏃訛紝daoAuthenticationProvider灝變細琚皟鐢ㄤ互鑾峰彇鐢ㄦ埛鎺堟潈淇℃伅銆傚鏋滄瘡嬈¢兘浠庢暟鎹簱鑾峰彇鐨勮瘽錛岄偅浠d環(huán)寰堥珮錛屽浜庝笉甯告敼鍙樼殑鐢ㄦ埛鍜岃祫婧愪俊鎭潵璇達紝鏈濂芥槸鎶婄浉鍏蟲巿鏉冧俊鎭紦瀛樿搗鏉ャ?璇﹁ 2.6.3 璧勬簮鏉冮檺瀹氫箟鎵╁睍 )
userCache鎻愪緵浜嗕袱縐嶅疄鐜? NullUserCache鍜孍hCacheBasedUserCache, NullUserCache瀹為檯涓婂氨鏄笉榪涜浠諱綍緙撳瓨錛孍hCacheBasedUserCache鏄嬌鐢‥hcache鏉ュ疄鐜扮紦鍔熻兘銆?/p>
聽聽聽 <bean id="userCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
聽聽聽聽聽聽聽 <property name="cacheManager" ref="cacheManager"/>
聽聽聽聽聽聽聽 <property name="cacheName" value="userCache"/>
聽聽聽 </bean>
聽聽聽 <bean id="userCache" class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache" autowire="byName">
聽聽聽聽聽聽聽 <property name="cache" ref="userCacheBackend"/>
聽聽聽 </bean>
聽聽聽 <bean id="resourceCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
聽聽聽聽聽聽聽 <property name="cacheManager" ref="cacheManager"/>
聽聽聽聽聽聽聽 <property name="cacheName" value="resourceCache"/>
聽聽聽 </bean>
聽聽聽 <bean id="resourceCache" class="org.springside.modules.security.service.acegi.cache.ResourceCache" autowire="byName">
聽聽聽聽聽聽聽 <property name="cache" ref="resourceCacheBackend"/>
聽聽聽 </bean>
6) basicProcessingFilter
銆銆鐢ㄤ簬澶勭悊HTTP澶寸殑璁よ瘉淇℃伅錛屽浠嶴pring榪滅▼鍗忚(濡侶essian鍜孊urlap)鎴栨櫘閫氱殑嫻忚鍣ㄥIE,Navigator鐨凥TTP澶翠腑鑾峰彇鐢ㄦ埛淇℃伅錛屽皢浠栦滑杞氦緇欓氳繃authenticationManager灞炴ц閰嶇殑璁よ瘉綆$悊鍣ㄣ傚鏋滆璇佹垚鍔燂紝浼氬皢涓涓狝uthentication瀵硅薄鏀懼埌浼氳瘽涓紝鍚﹀垯錛屽鏋滆璇佸け璐ワ紝浼氬皢鎺у埗杞氦緇欒璇佸叆鍙g偣(閫氳繃authenticationEntryPoint灞炴ц閰?聽聽聽 <bean id="basicProcessingFilter" class="org.acegisecurity.ui.basicauth.BasicProcessingFilter">
聽聽聽聽聽聽聽 <property name="authenticationManager" ref="authenticationManager"/>
聽聽聽聽聽聽聽 <property name="authenticationEntryPoint" ref="basicProcessingFilterEntryPoint"/>
聽聽聽 </bean>
銆銆閫氳繃鍚戞祻瑙堝櫒鍙戦佷竴涓狧TTP401(鏈巿鏉?娑堟伅錛屾彁紺虹敤鎴風櫥褰曘?br />澶勭悊鍩轟簬HTTP鐨勬巿鏉冭繃紼嬶紝 鍦ㄥ綋楠岃瘉榪囩▼鍑虹幇寮傚父鍚庣殑"鍘誨悜"錛岄氬父瀹炵幇杞悜銆佸湪response閲屽姞鍏rror淇℃伅絳夊姛鑳姐?/p>
<bean id="basicProcessingFilterEntryPoint" class="org.acegisecurity.ui.basicauth.BasicProcessingFilterEntryPoint">
聽聽聽聽聽聽聽 <property name="realmName" value="SpringSide Realm"/>
</bean>
銆銆褰撴姏鍑篈ccessDeniedException鏃訛紝灝嗙敤鎴烽噸瀹氬悜鍒扮櫥褰曠晫闈€傚睘鎬oginFormUrl閰嶇疆浜嗕竴涓櫥褰曡〃鍗曠殑URL,褰撻渶瑕佺敤鎴風櫥褰曟椂錛宎uthenticationProcessingFilterEntryPoint浼氬皢鐢ㄦ埛閲嶅畾鍚戝埌璇RL <bean id="authenticationProcessingFilterEntryPoint" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
聽聽聽聽聽聽聽 <property name="loginFormUrl">
聽聽聽聽聽聽聽聽聽聽聽 <value>/security/login.jsp</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="forceHttps" value="false"/>
</bean>2.2.3 HTTP瀹夊叏璇鋒眰
銆銆姣忔request鍓?HttpSessionContextIntegrationFilter浠嶴ession涓幏鍙朅uthentication瀵硅薄錛屽湪request瀹屽悗, 鍙堟妸Authentication瀵硅薄淇濆瓨鍒癝ession涓緵涓嬫request浣跨敤,姝ilter蹇呴』鍏朵粬Acegi filter鍓嶄嬌鐢紝浣夸箣鑳借法瓚婂涓姹傘?/p>
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"></bean>
聽聽聽 <bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
聽聽聽聽聽聽聽 <property name="allowIfAllAbstainDecisions" value="false"/>
聽聽聽聽聽聽聽 <property name="decisionVoters">
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <ref bean="roleVoter"/>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽 </property>
</bean>
2) httpRequestAccessDecisionManager
銆銆緇忚繃鎶曠エ鏈哄埗鏉ュ喅瀹氭槸鍚﹀彲浠ヨ闂煇涓璧勬簮(URL鎴栨柟娉?銆俛llowIfAllAbstainDecisions涓篺alse鏃跺鏋滄湁涓涓垨浠ヤ笂鐨刣ecisionVoters鎶曠エ閫氳繃,鍒欐巿鏉冮氳繃銆傚彲閫夌殑鍐崇瓥鏈哄埗鏈塁onsensusBased鍜孶nanimousBased聽聽聽 <bean id="httpRequestAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
聽聽聽聽聽聽聽 <property name="allowIfAllAbstainDecisions" value="false"/>
聽聽聽聽聽聽聽 <property name="decisionVoters">
聽聽聽聽聽聽聽聽聽聽聽 <list>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽 <ref bean="roleVoter"/>
聽聽聽聽聽聽聽聽聽聽聽 </list>
聽聽聽聽聽聽聽 </property>
聽聽聽 </bean>
3) roleVoter
聽銆銆蹇呴』鏄互rolePrefix璁懼畾鐨剉alue寮澶寸殑鏉冮檺鎵嶈兘榪涜鎶曠エ,濡侫UTH_ , ROLE_聽聽聽 <bean id="roleVoter" class="org.acegisecurity.vote.RoleVoter">
聽聽聽聽聽聽聽 <property name="rolePrefix" value="AUTH_"/>
聽聽 </bean>
銆銆寮傚父杞崲榪囨護鍣紝涓昏鏄鐞咥ccessDeniedException鍜孉uthenticationException錛屽皢緇欐瘡涓紓甯告壘鍒板悎閫傜殑"鍘誨悜"聽聽聽 <bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
聽聽聽聽聽聽聽 <property name="authenticationEntryPoint" ref="authenticationProcessingFilterEntryPoint"/>
聽聽聽 </bean>
銆銆鍜宻ervlet spec宸笉澶?澶勭悊鐧婚檰璇鋒眰.褰撹韓浠介獙璇佹垚鍔熸椂錛孉uthenticationProcessingFilter浼氬湪浼氳瘽涓斁緗竴涓狝uthentication瀵硅薄錛屽茍涓旈噸瀹氬悜鍒扮櫥褰曟垚鍔熼〉闈?br />聽聽聽聽聽聽聽聽 authenticationFailureUrl瀹氫箟鐧婚檰澶辮觸鏃惰漿鍚戠殑欏甸潰
聽聽聽聽聽聽聽聽 defaultTargetUrl瀹氫箟鐧婚檰鎴愬姛鏃惰漿鍚戠殑欏甸潰
聽聽聽聽聽聽聽聽 filterProcessesUrl瀹氫箟鐧婚檰璇鋒眰鐨勯〉闈?br />聽聽聽聽聽聽聽聽 rememberMeServices鐢ㄤ簬鍦ㄩ獙璇佹垚鍔熷悗娣誨姞cookie淇℃伅聽聽聽 <bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
聽聽聽聽聽聽聽 <property name="authenticationManager" ref="authenticationManager"/>
聽聽聽聽聽聽聽 <property name="authenticationFailureUrl">
聽聽聽聽聽聽聽聽聽聽聽 <value>/security/login.jsp?login_error=1</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="defaultTargetUrl">
聽聽聽聽聽聽聽聽聽聽聽 <value>/admin/index.jsp</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="filterProcessesUrl">
聽聽聽聽聽聽聽聽聽聽聽 <value>/j_acegi_security_check</value>
聽聽聽聽聽聽聽 </property>
聽聽聽聽聽聽聽 <property name="rememberMeServices" ref="rememberMeServices"/>
聽聽聽 </bean>
銆銆鍦ㄦ墽琛岃漿鍚憉rl鍓嶆鏌bjectDefinitionSource涓瀹氱殑鐢ㄦ埛鏉冮檺淇℃伅銆傞鍏堬紝objectDefinitionSource涓畾涔変簡璁塊棶URL闇瑕佺殑灞炴т俊鎭?榪欓噷鐨勫睘鎬т俊鎭粎浠呮槸鏍囧織錛屽憡璇塧ccessDecisionManager瑕佺敤鍝簺voter鏉ユ姇紲?銆傜劧鍚庯紝authenticationManager鎺夌敤鑷繁鐨刾rovider鏉ュ鐢ㄦ埛鐨勮璇佷俊鎭繘琛屾牎楠屻傛渶鍚庯紝鏈夋姇紲ㄨ呮牴鎹敤鎴鋒寔鏈夎璇佸拰璁塊棶url闇瑕佺殑灞炴э紝璋冪敤鑷繁鐨剉oter鏉ユ姇紲紝鍐沖畾鏄惁鍏佽璁塊棶銆?/p>
聽聽聽 <bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
聽聽聽聽聽聽聽 <property name="authenticationManager" ref="authenticationManager"/>
聽聽聽聽聽聽聽 <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
聽聽聽聽聽聽聽 <property name="objectDefinitionSource" ref="filterDefinitionSource"/>
聽聽聽 </bean>
7) filterDefinitionSource (璇﹁ 2.6.3 璧勬簮鏉冮檺瀹氫箟鎵╁睍)
銆銆鑷畾涔塂BFilterInvocationDefinitionSource浠庢暟鎹簱鍜宑ache涓鍙栦繚鎶よ祫婧愬強鍏墮渶瑕佺殑璁塊棶鏉冮檺淇℃伅聽<bean id="filterDefinitionSource" class="org.springside.modules.security.service.acegi.DBFilterInvocationDefinitionSource">
聽聽聽聽聽聽聽 <property name="convertUrlToLowercaseBeforeComparison" value="true"/>
聽聽聽聽聽聽聽 <property name="useAntPath" value="true"/>
聽聽聽聽聽聽聽 <property name="acegiCacheManager" ref="acegiCacheManager"/>
</bean>2.2.4 鏂規(guī)硶璋冪敤瀹夊叏鎺у埗
銆銆鍦ㄦ墽琛屾柟娉曞墠榪涜鎷︽埅錛屾鏌ョ敤鎴鋒潈闄愪俊鎭?br />2) methodDefinitionSource
銆銆鑷畾涔塎ethodDefinitionSource浠巆ache涓鍙栨潈闄?/p>
聽聽 <bean id="methodSecurityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
聽聽聽聽聽聽聽 <property name="authenticationManager" ref="authenticationManager"/>
聽聽聽聽聽聽聽 <property name="accessDecisionManager" ref="httpRequestAccessDecisionManager"/>
聽聽聽聽聽聽聽 <property name="objectDefinitionSource" ref="methodDefinitionSource"/>
聽聽聽 </bean>
聽聽聽 <bean id="methodDefinitionSource" class="org.springside.modules.security.service.acegi.DBMethodDefinitionSource">
聽聽聽聽聽聽聽 <property name="acegiCacheManager" ref="acegiCacheManager"/>
聽聽聽 </bean>2.3 Jcaptcha楠岃瘉鐮?/h2>
http://www.coachthrasher.com/page/blog?entry=jcaptcha_with_appfuse銆?/p>
]]>
Subscriber Code: jLR8ZC-444-55-4467865481680090
Subscriber:www.1cn.biz
Subscriber Code: jLR8ZC-444-55-4467865481680090
]]>
鐩稿叧鍐呭錛歀ocal,聽DataFormat,聽MessageFormat,聽SimpleDateFormat,聽Format
---------------------------------------------------------------
java.text.NumberFormat綾繪湁涓変釜鏂規(guī)硶鍙互浜х敓涓嬪垪鏁版嵁鐨勬爣鍑嗘牸寮忓寲鍣細
鏁板瓧
璐у竵
鐧懼垎鏁?br />
---------------------------------------------------------------
鍒涘緩鏍煎紡鍖栧櫒(榛樿鍦板尯Local鏍煎紡)錛?br />NumberFormat.getNumberInstance();
NumberFormat.getCurrencyInstance();
NumberFormat.getPercentInstance();
---------------------------------------------------------------
渚嬮錛?br />double聽dbl=10000.0/3;
NumberFormat聽formatter=NumberFormat.getNumberInstance();
String聽s=formatter.format(x);
System.out.println(s);
---------------------------------------------------------------
璁懼畾鏁存暟鎴栧皬鏁伴儴鍒嗘墍鏄劇ず鐨勬渶灝戝拰鏈澶氫綅鏁幫紝鍙互浣跨敤NumberFormat綾?br />鐨勬柟娉曪細
setMinimumIntegerDigits(int)
setMinimumFractionDigits(int)
setMaximumIntegerDigits(int)
setMaximumFractionDigits(int)
璁懼畾灝忔暟閮ㄥ垎鐨勬渶澶氫綅寰堟湁鐢ㄥ銆傚鏋滃皬鏁伴儴鍒嗕涪澶辯殑絎竴浣嶆暟瀛楀ぇ浜庣瓑浜?錛?br />閭d箞鏄劇ず鐨勬渶鍚庝竴浣嶄細澧?錛堝洓鑸嶄簲鍏ワ級銆傚鏋滆鏄劇ず灝鵑殢鐨勯浂錛屽彲浠ユ妸灝忔暟閮ㄥ垎鐨勬渶灝戜綅絳変簬鏈澶氫綅銆?br />濡傛灉涓嶆兂鏄劇ず錛屽彲浠ユ妸灝忔暟閮ㄥ垎鐨勬渶灝戜綅璁懼畾涓?鎴栦笉璁懼畾銆?br />
鎸囧畾鏈澶氫綅鏁存暟鐩稿綋鍗遍櫓錛屾樉紺哄煎皢浼氳鎴柇錛屼駭鐢熶竴涓敊璇殑鍊箋?br />
---------------------------------------------------------------
嫻嬭瘯渚嬮錛?br />
鏂囦歡鍚峊estNumberFormat.java
--------------------------------------------------------
import聽java.text.NumberFormat;
public聽class聽TestNumberFormat
{
聽聽聽聽public聽static聽void聽main(String[]聽args)聽{
聽聽聽聽聽聽聽聽聽聽聽聽NumberFormat聽nFormat=NumberFormat.getNumberInstance();
聽聽聽聽聽聽聽聽聽聽聽聽nFormat.setMinimumIntegerDigits(3);//璁劇疆鏁存暟閮ㄥ垎鑷沖皯涓?浣?br />聽聽聽聽聽聽聽聽聽聽聽聽nFormat.setMaximumFractionDigits(5);//璁劇疆灝忔暟鐐瑰悗闈㈠熬鏁頒負5
聽聽聽聽聽聽聽聽System.out.println("Format聽Out聽3.2128345="+nFormat.format(3.2128345));
聽聽聽聽聽聽聽聽聽聽聽聽NumberFormat聽cFormat=NumberFormat.getCurrencyInstance();
聽聽聽聽聽聽聽聽聽聽聽聽cFormat.setMaximumFractionDigits(3);
聽聽聽聽聽聽聽聽System.out.println("Format聽Out聽321283.47656="+cFormat.format(321283.47656));
聽聽聽聽聽聽聽聽聽聽聽聽NumberFormat聽pFormat=NumberFormat.getPercentInstance();
聽聽聽聽聽聽聽聽聽聽聽聽pFormat.setMaximumFractionDigits(4);
聽聽聽聽聽聽聽聽System.out.println("Format聽Out聽3.2128345="+pFormat.format(3.2128345));
聽聽聽聽聽聽聽聽System.out.println("Format聽Out聽null="+nFormat.format(null));//鍙傛暟鏄痭ull,鍑虹幇寮傚父
聽聽聽聽聽聽聽聽//Throws聽聽IllegalArgumentException
聽聽聽聽}
}
//=================聽榪愯緇撴灉濡備笅聽=======================
Format聽Out聽3.2128345=003.21283
Format聽Out聽321283.47656=錕?21,283.477
Format聽Out聽3.2128345=321.2834%
Exception聽in聽thread聽"main"聽java.lang
]]>
銆銆鍏跺疄鎮(zhèn)ㄤ篃鍙互瀹屽叏涓嶄嬌鐢ㄩ厤緗枃浠訛紝鑰屾槸鍦ㄤ唬鐮佷腑閰嶇疆Log4j鐜銆備絾鏄紝浣跨敤閰嶇疆鏂囦歡灝嗕嬌鎮(zhèn)ㄧ殑搴旂敤紼嬪簭鏇村姞鐏墊椿銆侺og4j鏀寔涓ょ閰嶇疆鏂囦歡鏍煎紡錛屼竴縐嶆槸XML鏍煎紡鐨勬枃浠訛紝涓縐嶆槸Java鐗規(guī)ф枃浠訛紙閿?鍊鹼級銆備笅闈㈡垜浠粙緇嶄嬌鐢↗ava鐗規(guī)ф枃浠跺仛涓洪厤緗枃浠剁殑鏂規(guī)硶錛?/p>
銆銆1.閰嶇疆鏍筁ogger錛屽叾璇硶涓猴細
銆銆log4j.rootLogger = [ level ] , appenderName, appenderName, 鈥?
銆銆鍏朵腑錛宭evel 鏄棩蹇楄褰曠殑浼樺厛綰э紝鍒嗕負OFF銆丗ATAL銆丒RROR銆乄ARN銆両NFO銆丏EBUG銆丄LL鎴栬呮?zhèn)ㄥ畾涔夌殑珩斿埆銆侺og4j寤鴻鍙嬌鐢ㄥ洓涓駭鍒紝浼樺厛綰т粠楂樺埌浣庡垎鍒槸ERROR銆乄ARN銆両NFO銆丏EBUG銆傞氳繃鍦ㄨ繖閲屽畾涔夌殑綰у埆錛屾?zhèn)ㄥ彲浠ユ帶鍒跺埌搴旂敤绋嬪簭涓浉搴斁Uу埆鐨勬棩蹇椾俊鎭殑寮鍏熾傛瘮濡傚湪榪欓噷瀹氫箟浜咺NFO綰у埆錛屽垯搴旂敤紼嬪簭涓墍鏈塂EBUG綰у埆鐨勬棩蹇椾俊鎭皢涓嶈鎵撳嵃鍑烘潵銆?appenderName灝辨槸鎸囧畾鏃ュ織淇℃伅杈撳嚭鍒板摢涓湴鏂廣傛?zhèn)ㄥ彲浠ュ悓鏃舵寚瀹氬涓緭鍑虹洰鐨勫湴銆?
銆銆2.閰嶇疆鏃ュ織淇℃伅杈撳嚭鐩殑鍦癆ppender錛屽叾璇硶涓猴細
銆銆log4j.appender.appenderName = fully.qualified.name.of.appender.class
銆銆log4j.appender.appenderName.option1 = value1
銆銆鈥?
銆銆log4j.appender.appenderName.option = valueN
銆銆鍏朵腑錛孡og4j鎻愪緵鐨刟ppender鏈変互涓嬪嚑縐嶏細
銆銆org.apache.log4j.ConsoleAppender錛堟帶鍒跺彴錛夛紝
銆銆org.apache.log4j.FileAppender錛堟枃浠訛級錛?
銆銆org.apache.log4j.DailyRollingFileAppender錛堟瘡澶╀駭鐢熶竴涓棩蹇楁枃浠訛級錛?br />銆銆org.apache.log4j.RollingFileAppender錛堟枃浠跺ぇ灝忓埌杈炬寚瀹氬昂瀵哥殑鏃跺欎駭鐢熶竴涓柊鐨勬枃浠訛級錛?
銆銆org.apache.log4j.WriterAppender錛堝皢鏃ュ織淇℃伅浠ユ祦鏍煎紡鍙戦佸埌浠繪剰鎸囧畾鐨勫湴鏂癸級
銆銆3.閰嶇疆鏃ュ織淇℃伅鐨勬牸寮忥紙甯冨眬錛夛紝鍏惰娉曚負錛?/p>
銆銆log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
銆銆log4j.appender.appenderName.layout.option1 = value1
銆銆鈥?
銆銆log4j.appender.appenderName.layout.option = valueN
銆銆鍏朵腑錛孡og4j鎻愪緵鐨刲ayout鏈変互涓嬪嚑縐嶏細
銆銆org.apache.log4j.HTMLLayout錛堜互HTML琛ㄦ牸褰㈠紡甯冨眬錛夛紝
銆銆org.apache.log4j.PatternLayout錛堝彲浠ョ伒媧誨湴鎸囧畾甯冨眬妯″紡錛夛紝
銆銆org.apache.log4j.SimpleLayout錛堝寘鍚棩蹇椾俊鎭殑綰у埆鍜屼俊鎭瓧絎︿覆錛夛紝
銆銆org.apache.log4j.TTCCLayout錛堝寘鍚棩蹇椾駭鐢熺殑鏃墮棿銆佺嚎紼嬨佺被鍒瓑絳変俊鎭級
銆銆Log4J閲囩敤綾諱技C璇█涓殑printf鍑芥暟鐨勬墦鍗版牸寮忔牸寮忓寲鏃ュ織淇℃伅錛屾墦鍗板弬鏁板涓嬶細 %m 杈撳嚭浠g爜涓寚瀹氱殑娑堟伅
銆銆%p 杈撳嚭浼樺厛綰э紝鍗矰EBUG錛孖NFO錛學ARN錛孍RROR錛孎ATAL
銆銆%r 杈撳嚭鑷簲鐢ㄥ惎鍔ㄥ埌杈撳嚭璇og淇℃伅鑰楄垂鐨勬縐掓暟
銆銆%c 杈撳嚭鎵灞炵殑綾葷洰錛岄氬父灝辨槸鎵鍦ㄧ被鐨勫叏鍚?
銆銆%t 杈撳嚭浜х敓璇ユ棩蹇椾簨浠剁殑綰跨▼鍚?
銆銆%n 杈撳嚭涓涓洖杞︽崲琛岀錛學indows騫沖彴涓衡淺r\n鈥濓紝Unix騫沖彴涓衡淺n鈥?
銆銆%d 杈撳嚭鏃ュ織鏃墮棿鐐圭殑鏃ユ湡鎴栨椂闂達紝榛樿鏍煎紡涓篒SO8601錛屼篃鍙互鍦ㄥ叾鍚庢寚瀹氭牸寮忥紝姣斿錛?d{yyy MMM dd HH:mm:ss,SSS}錛岃緭鍑虹被浼鹼細2002騫?0鏈?8鏃?22錛?0錛?8錛?21
銆銆%l 杈撳嚭鏃ュ織浜嬩歡鐨勫彂鐢熶綅緗紝鍖呮嫭綾葷洰鍚嶃佸彂鐢熺殑綰跨▼錛屼互鍙婂湪浠g爜涓殑琛屾暟銆備婦渚嬶細Testlog4.main(TestLog4.java:10)
銆銆浜屻佸湪浠g爜涓嬌鐢↙og4j
銆銆1.寰楀埌璁板綍鍣?/p>
銆銆浣跨敤Log4j錛岀涓姝ュ氨鏄幏鍙栨棩蹇楄褰曞櫒錛岃繖涓褰曞櫒灝嗚礋璐f帶鍒舵棩蹇椾俊鎭傚叾璇硶涓猴細
銆銆public static Logger getLogger( String name)
銆銆閫氳繃鎸囧畾鐨勫悕瀛楄幏寰楄褰曞櫒錛屽鏋滃繀瑕佺殑璇濓紝鍒欎負榪欎釜鍚嶅瓧鍒涘緩涓涓柊鐨勮褰曞櫒銆侼ame涓鑸彇鏈被鐨勫悕瀛楋紝姣斿錛?
銆銆static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
銆銆2.璇誨彇閰嶇疆鏂囦歡
銆銆褰撹幏寰椾簡鏃ュ織璁板綍鍣ㄤ箣鍚庯紝絎簩姝ュ皢閰嶇疆Log4j鐜錛屽叾璇硶涓猴細
銆銆BasicConfigurator.configure ()錛?鑷姩蹇熷湴浣跨敤緙虹渷Log4j鐜銆?br />銆銆PropertyConfigurator.configure ( String configFilename) 錛氳鍙栦嬌鐢↗ava鐨勭壒鎬ф枃浠剁紪鍐欑殑閰嶇疆鏂囦歡銆?br />銆銆DOMConfigurator.configure ( String filename ) 錛氳鍙朮ML褰㈠紡鐨勯厤緗枃浠躲?/p>
銆銆3.鎻掑叆璁板綍淇℃伅錛堟牸寮忓寲鏃ュ織淇℃伅錛?/p>
銆銆褰撲笂涓や釜蹇呰姝ラ鎵ц瀹屾瘯錛屾?zhèn)鍙互杞绘潙譁颁娇鐢ㄤ笉鍚屼紭鍏埦Uу埆鐨勬棩蹇楄褰曡鍙ユ彃鍏ュ埌鎮(zhèn)ㄦ兂璁板綍鏃ュ織鐨勪換浣曞湴鏂癸紝鍏惰娉曞涓嬶細
銆銆Logger.debug ( Object message ) ;
銆銆Logger.info ( Object message ) ;
銆銆Logger.warn ( Object message ) ;
銆銆Logger.error ( Object message ) ;
鏈琩emo鏃㈤傚悎浜嶫SF + Spring2.0.1 + Hibernate3.2 欏圭洰涔熼傚悎浜嶴truts + Spring2.0.1 + Hibernate3.2欏圭洰錛?br />
鏈垪鍏ョ壒鍒鏄庢病鏈夋巿鏉冪殑浼佷笟鍜屼釜浜洪兘鍙互鑷敱鍏嶈垂涓嬭澆浣跨敤鎻愪緵瀹濊吹鎰忚錛?br />
鏈漢涓嶆ュ姛榪戝埄錛屾鍦ㄥ仛瀹屾暣鐨勬枃妗g紪鍐欙紝鍋氭渶鍚庝弗鏍肩殑嫻嬭瘯錛岃繎鏈熷湪姝ゅ厤璐瑰彂甯冿紝鏁鍏蟲敞錛?/p>
聽 |
聽var strm = document.myform.CoMail.value聽聽 //鎻愪氦mail鍦板潃鐨勬枃鏈 聽var regm = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;//楠岃瘉Mail鐨勬鍒欒〃杈懼紡,^[a-zA-Z0-9_-]:寮澶村繀欏諱負瀛楁瘝,涓嬪垝綰?鏁板瓧, 聽if (!strm.match(regm) && strm!="") 聽聽 { 聽聽聽聽 alert("閭鍦板潃鏍煎紡閿欒鎴栧惈鏈夐潪娉曞瓧絎?\n璇鋒鏌ワ紒"); 聽聽document.myform.CoMail.select();聽聽 聽聽return false; 聽聽聽 } |