<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    張昊

    J-Hi(http://www.j-hi.net)

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      45 Posts :: 1 Stories :: 110 Comments :: 0 Trackbacks

    #


    我在博客發(fā)表的文章大部分均被51CTO網(wǎng)站所收錄,并且51CTO還為J-Hi做了專訪 

    “J-Hi”Java開源平臺(tái)的生力軍




    專題的URL為:http://developer.51cto.com/art/201103/250221.htm


    posted @ 2011-04-04 21:07 張昊 閱讀(1061) | 評(píng)論 (0)編輯 收藏


    posted @ 2011-04-01 19:33 張昊 閱讀(1588) | 評(píng)論 (0)編輯 收藏

    首先描述最簡(jiǎn)單的身份驗(yàn)證后臺(tái)的處理過程

    1、 用戶輸入需要確認(rèn)自己身份的信息,如賬號(hào)與密碼或許需要其它信息

    2、 也許你希望提供多種有方式的驗(yàn)證形式,由系統(tǒng)選擇最合適的那一種,如從數(shù)據(jù)庫(DAO)或是通過身份驗(yàn)證中心的服務(wù)(ACS)統(tǒng)一管理等

    3、 根據(jù)賬號(hào)找到指定源中的用戶、密碼及所擁有的權(quán)限(如果沒找到就拋出異常)等用戶的身份信息,驗(yàn)證用戶輸入的信息與源中返回的信息是否一致(如密碼)

    4、 為了不至于每次都重復(fù)上面的過程,還要將驗(yàn)證后的信息緩存起來,如放到session

    acegi結(jié)合分析

    1、 用戶提交后為了能進(jìn)行上述的處理,acegi不是通過請(qǐng)求-影響模式,而是能過ServletFilter實(shí)現(xiàn)的。可以理解成這個(gè)身份驗(yàn)證的主入口,不同的處理機(jī)制采用不同的Filter,類名的規(guī)則為*ProcessingFilter,這些類全部都繼承至javax.servlet.Filter接口。下面是幾個(gè)常用的過濾器

    模塊

    功能

    BasicProcessingFilter

    按照RFC1945處理基本的身份驗(yàn)證請(qǐng)求

    CasProcessingFilter

    處理耶魯大學(xué)的中心身份驗(yàn)證服務(wù)器(CAS)許可

    AnonymousProcessingFilter

    對(duì)匿名身份的處理

    AuthenticationProcessingFilter

    處理類似于Servlet規(guī)范的j_security_checkHttp form post

    Spring的配置過程中有些過濾器除了自身的信息外,還有可能需要切入點(diǎn),以便切入到其它模塊中的配置信息。如AuthenticationProcessingFilter驗(yàn)證不通過的處理頁面或要采用的協(xié)議、CasProcessingFilter需要提交到CAS上的其他信息。它們的統(tǒng)一接口類為AuthenticationEntryPoint在此要注意的是,切入點(diǎn)與過濾器之間有著密切的聯(lián)系與對(duì)應(yīng)關(guān)系的。

    2、 acegi為了實(shí)現(xiàn)多種方式的驗(yàn)證形式提供了AuthenticationManager接口,目的是對(duì)多種驗(yàn)證形式進(jìn)行管理,并通過指定的驗(yàn)證形式返回用戶的身份。所以上述的過濾器均會(huì)調(diào)用該接口的authenticate(Authentication authentication)方法以返回當(dāng)前用戶的身份信息。該接口主要的實(shí)現(xiàn)類是ProviderManager

    AuthenticationProvider(身份驗(yàn)證供應(yīng)器)接口有很多實(shí)現(xiàn)類,每個(gè)都致力于處理一個(gè)特定身份驗(yàn)證的具體實(shí)現(xiàn),AuthenticationManager負(fù)責(zé)輪詢AuthenticationProvider列表,并使用第一個(gè)能夠處理給定的Authentication請(qǐng)求對(duì)象的AuthenticationProvider。身份驗(yàn)證供應(yīng)器也就是上面說的驗(yàn)證形式。最常用的是DaoAuthenticationProvider,實(shí)現(xiàn)從數(shù)據(jù)庫中獲取用戶的身份信息

    3、 acegi中用戶的身份信息存放到以Authentication接口的實(shí)現(xiàn)類的實(shí)例中。在介紹該接口之前先要了解一些關(guān)鍵術(shù)語

    1) principal(主體)指可以執(zhí)行操作的用戶、服務(wù)或代理(agent),即身份驗(yàn)證的發(fā)啟者

    2) credential(憑證)指主體提供密碼之類用于身份驗(yàn)證(authentication)的信息戳

    3) authentication(身份驗(yàn)證)確定調(diào)用者身份的過程

    4) authorization(授權(quán))指決定哪個(gè)主體準(zhǔn)許執(zhí)行給定操作的過程

    Authentication接口包含主體標(biāo)示、主體的憑證以及主體所擁有的一組權(quán)限。

    Authentication接口繼承java.security.Principal接口,因此Authentication天生就要滿足主體的類型。該接口實(shí)際上是上述幾個(gè)關(guān)鍵詞對(duì)象化的一個(gè)容器,它存儲(chǔ)了身份驗(yàn)證的全部信息。由此會(huì)發(fā)現(xiàn)它與AuthenticationProvider(身份驗(yàn)證供應(yīng)器)有著天然的聯(lián)系,如對(duì)于數(shù)據(jù)庫的供應(yīng)器它只要記錄用戶的帳號(hào)和密碼,但對(duì)于CAS它還可能還要記錄服務(wù)器響應(yīng)的列表,或是與認(rèn)證相關(guān)的其它信息。因此該接口對(duì)應(yīng)身份驗(yàn)證供應(yīng)器有多個(gè)實(shí)現(xiàn)類。正因?yàn)橛诖耍械膶?shí)現(xiàn)類對(duì)于開發(fā)者來說幾乎是隱藏在,可以理解成工具或是服務(wù)類

    下面對(duì)Authentication接口中的方法做詳細(xì)擴(kuò)展說明

    1) getPrincipal(獲得主體)getCredential(獲得憑證),它們的設(shè)置過程:無論何種驗(yàn)證形式用戶都是通過用戶輸入帳號(hào)和密碼開始的,過濾器會(huì)攔截用戶的請(qǐng)求,由驗(yàn)證管理器(AuthenticationManager)找到合適的身份驗(yàn)證供應(yīng)器(AuthenticationProvider)提供身份驗(yàn)證。在AuthenticationManager接口只有一個(gè)方法authenticate(…),而該方法的參數(shù)與返回類型均是Authentication。所以大多數(shù)過濾器在請(qǐng)求身份驗(yàn)證前總是創(chuàng)建一個(gè)簡(jiǎn)單的UsernamePasswordAuthenticationToken(該類是Authentication接口的子類)對(duì)象,將其作為AuthenticationManager.authenticate(…)方法中的參數(shù),再由AuthenticationProvider依據(jù)自身的特點(diǎn)創(chuàng)建相應(yīng)的Authentication接口子類的實(shí)例,因此身份驗(yàn)證的具體信息也是在這最后一步完成的,即是在AuthenticationProvider中被創(chuàng)建與賦值的。其中就包括主體與憑證。如對(duì)于數(shù)據(jù)庫來說也是賬號(hào)與密碼。

    2) getAuthorities()得到當(dāng)前用戶所擁有的全部權(quán)限。Acegi提供一個(gè)GrantedAuthority接口,用于對(duì)應(yīng)應(yīng)用系統(tǒng)中有真正意義的權(quán)限實(shí)現(xiàn)。常用的是GrantedAuthorityImpl,它存儲(chǔ)主體的已獲授權(quán)的String表示,即權(quán)限也就是字符串的表示。而GrantedAuthority僅對(duì)字符做一層簡(jiǎn)單的封裝。

    3) getDetails()獲取詳細(xì)資料,目的是得到當(dāng)前用戶的詳細(xì)信息,如在應(yīng)用系統(tǒng)可以是用戶的一個(gè)Bean(所在的部門,真實(shí)姓名…)。為此Acegi提供了一個(gè)UserDetails接口.

    l         isAccountNonExpired         帳號(hào)是否未過期

    l         isAccountNonLocked           帳號(hào)是否未鎖定

    l         isCredentialsNonExpired密碼是否未過期

    l         isEnabled                             是否可用(激活)

    我們會(huì)發(fā)現(xiàn)對(duì)于一個(gè)應(yīng)用系統(tǒng)來說,用戶的詳細(xì)信息中除與身份驗(yàn)證相關(guān)的信息外還要很多其它的信息,如用戶所在的部門、電話。為此acegi提供了另一個(gè)接口AuthenticationDetailsSource,它僅提供一個(gè)方法buildDetails(HttpServletRequest request)用以創(chuàng)建客戶化的用戶信息。在過濾器中在執(zhí)行身份驗(yàn)證之前調(diào)用該方法。

    4) isAuthenticated(),是否通過了身份驗(yàn)證

    當(dāng)通過主體(帳號(hào))從源(DAOCASJAAS…)中返回的信息中創(chuàng)建出Authentication實(shí)例后,還要校驗(yàn)用戶的憑證(密碼)的一致性。對(duì)于提供了以PasswordEncoder接口為代表的一組密碼編碼器的實(shí)現(xiàn)

    4、 在我們討論對(duì)于身份驗(yàn)證(Authentication)對(duì)象的保存之前,先來說明一下對(duì)它的訪問。為了確保任何對(duì)身份驗(yàn)證感興趣的類型都可以訪問它,acegi通過SecurityContextHolder(該類中提供的所有成員方法均是靜態(tài)的)用來保持SecurityContextThreadLocal對(duì)象。

    通過SecurityContext類圖可以看出在它很簡(jiǎn)單只是對(duì)Authentication對(duì)象的一個(gè)引用,之所以又做了這樣一層包裝的目的是為了客戶可以做任意的擴(kuò)展。由于SecurityContextHolder引用的是線程ThreadLocal集合,而對(duì)于B/S系統(tǒng)來說,一個(gè)線程的生命期還是太短了,無法保證SecurityContext對(duì)象的信息在一個(gè)線程執(zhí)行后不會(huì)被JVM垃圾回收。一般來說我們會(huì)將SecurityContext放到session中,但這樣又無法保證在邏輯層中訪問到session。對(duì)此acegi的解決方案是通過javax.servlet.Filter使不同與的訪問范圍與SecurityContextHolder做整合(session為例,每次請(qǐng)求過濾器都會(huì)從session中取得SecurityContext然后再將其賦到SecurityContextHolder)Acegi提供了多種整合過濾器,命名規(guī)則為*IntegrationFilter

    模塊

    功能

    HttpSessionContextIntegrationFilter

    請(qǐng)求之間使用HttpSession存儲(chǔ)SecurityContext

    HttpRequestIntegrationFilter

    HttpServletRequest.getUserPrincipal()獲得身份驗(yàn)證,但在請(qǐng)求結(jié)束時(shí)不能將該身份驗(yàn)證寫回該位置

    JbossIntegrationFilter

    Jbossjava:comp/env/security/subjectJNDI位置獲取身份驗(yàn)證,但在請(qǐng)求結(jié)束時(shí)不能將該身份驗(yàn)證寫回該位置

    接下來再來討論對(duì)Authentication的設(shè)置,當(dāng)處理過濾器調(diào)用AuthenticationManager. Authentication(…)獲得Authentication對(duì)象后,它會(huì)調(diào)用自身的成員方法successfulAuthentication(…)將其封裝為SecurityContext并設(shè)置到SecurityContextHolder中。

    注意successfulAuthentication(…)方法是在抽象類AbstractProcessingFilter中,而有一些處理過程器并沒有繼承該類,所以只有AbstractProcessingFilter的子類才會(huì)在當(dāng)前線程中取得SecurityContext對(duì)象。

    再來描述授權(quán)的后臺(tái)的處理過程

    1、 我們可能希望在三個(gè)地方做安全驗(yàn)證,即是否可以訪問當(dāng)前頁面,是否可以調(diào)用當(dāng)前方法,是否可以控制當(dāng)前方法參數(shù)的對(duì)象域

    2、 對(duì)于安全驗(yàn)證的判斷可能希望提供不同的表決策略,如一票否決制,還是有一票同意就通過或是同意大于否決票時(shí)才通過。

    3、 總之,所有需要的處理無非是在做這樣的工作。當(dāng)前用戶所擁有的權(quán)限中,否則有(或匹配)與當(dāng)前被調(diào)用者(頁面、方法、域)所指定的權(quán)限

    Acegi對(duì)于授權(quán)的技術(shù)實(shí)現(xiàn)

    從技術(shù)上話,授權(quán)完全與日志一樣是一個(gè)橫切關(guān)注點(diǎn),與具體業(yè)務(wù)沒有任何關(guān)系。而Acegi只是借助SpringAOPjavax.servlet.Filter,對(duì)這授權(quán)方面的攔截。對(duì)于攔截器與其持有的對(duì)象Acegi提供如下實(shí)現(xiàn):

    攔截器

    描述

    持有的對(duì)象

    描述

    AbstractSecurityInterceptor

    是所有攔截器的抽象父類,實(shí)際授權(quán)的全部驗(yàn)證過程均在該類beforeInvocation()afterInvocation()兩個(gè)方法中完成,子類只是區(qū)別不同類型的安全對(duì)象。

    FilterSecurityInterceptor

    是一個(gè)web的過濾器,用于對(duì)頁面(URL)的授權(quán)驗(yàn)證

    FilterInvocation

    僅是對(duì)簡(jiǎn)單crequestresponseFilterChain包裝的實(shí)現(xiàn)

    MethodSecurityInterceptor

    用于驗(yàn)證Spring容器中bean的方法,并且需要使用Spring中的代理

    MethodInvocation

    AOP Alliance提供的被代理對(duì)象接口,運(yùn)行時(shí)的實(shí)際對(duì)象類型是由Spring提供的ReflectiveMethodInvocationCglibMethodInvocation

    AspectJSecurityInterceptor

    該類是在指定切入點(diǎn)調(diào)用AspectJ

    JoinPoint AspectJCallback

    執(zhí)行AspectJ的回調(diào)






    AbstractSecurityInterceptor的執(zhí)行過程:

    首先查詢應(yīng)用于該調(diào)用的配置屬性。如果沒有任何配置屬性,該調(diào)用被認(rèn)為是公有的,并且繼續(xù)進(jìn)行該調(diào)用。如果找到配置屬性,包含在SecurityContextHolder中的Authentication是通過AuthenticationManager驗(yàn)證的,并且請(qǐng)求AccessDecisionManager來批準(zhǔn)該請(qǐng)求,如果成功RunAsManager可以替代該Authentication的標(biāo)識(shí),然后繼續(xù)進(jìn)行該調(diào)用。調(diào)用完成時(shí),將通過更新SecurityContextHolder來包含實(shí)際的身份驗(yàn)證對(duì)象以清除RunAsManager的替代標(biāo)識(shí)。最后調(diào)用AfterInvocationManager,如果定義了的話。

    RunAsManager:該接口的主要作用成員方法是Authentication buildRunAs(Authentication authentication, Object object, ConfigAttributeDefinition config)目的是當(dāng)執(zhí)行特定操作時(shí)用于選擇性的替換Authentication對(duì)象,該方法是在安全驗(yàn)證之后,安全對(duì)象執(zhí)行之前被調(diào)用。在安全對(duì)象執(zhí)行之后該方法對(duì)Authentication對(duì)象替換后被還原。

    AfterInvocationManager:作用是修改從安全對(duì)象調(diào)用中返回的對(duì)象。這通常被用來過濾僅針對(duì)已包含、已驗(yàn)證元素的集合,或者如果信息是受保護(hù)的,轉(zhuǎn)換實(shí)例變量。如果該主體沒有針對(duì)返回對(duì)象的權(quán)限,它還可以拋出AccessDeniedException。主要的方法是

    Object decide(Authentication authentication, Object object, ConfigAttributeDefinition config,        Object returnedObject) throws AccessDeniedException,它需要返回一個(gè)對(duì)象,然后該對(duì)象將變成安全對(duì)象調(diào)用的結(jié)果。輪詢AfterInvocationProvider接口的具體類。

    最后分析權(quán)限表決的原理,還是讓我們虛擬這樣一個(gè)場(chǎng)景:

    1、 要求有兩個(gè)表決器,1)判斷當(dāng)前用戶是否為超級(jí)管理員,2)判斷當(dāng)前用戶是否擁有當(dāng)前所調(diào)用的方法或頁面的權(quán)限

    2、 如果其中任何一個(gè)表決器投出贊成票,就認(rèn)為通過。這是一種表決策略

    Acegi結(jié)合分析

    2、表決策略作用是輪詢所有的表決器,根據(jù)當(dāng)前策略結(jié)合表決器的表決結(jié)果,做出最終判斷結(jié)果。Acegi表決策略管理的接口是

    1)      decide(…)根據(jù)當(dāng)前用戶所擁有的權(quán)限信息[authentication],攔截器所持有的對(duì)象[object]以及在配置文件中所持有對(duì)象所必要的權(quán)限s[config],輪詢表決器做出決策。

    2)      supports(ConfigAttribute)判斷所有表決器是否有一個(gè)以上支持這種權(quán)限的表示形式

    3)      supports(Class) 判斷所有表決器是否有一個(gè)以上支持?jǐn)r截器所持有的對(duì)象類型

    后兩個(gè)方法主要在是各種攔截器初始化時(shí)調(diào)用,以但Spring驗(yàn)證bean定義的合法性

    對(duì)于表決策略來說最終可能會(huì)得到三個(gè)結(jié)果中的一個(gè)贊成、否決或是棄權(quán)(結(jié)果是由表決器結(jié)合策略得到的)。對(duì)于棄權(quán)的產(chǎn)生是由于攔截器所持有的對(duì)象在配置中沒有設(shè)置任何權(quán)限。為此該接口的抽象子類提供allowIfAllAbstainDecisions開關(guān),如果所有表決器投出的均為棄權(quán)票,表示沒有通過授權(quán)則將該屬性設(shè)為true,默認(rèn)為false.

    Acegi提供了多種表決策略

    注意:一個(gè)表決器只能投一票

    AffirmativeBased       有一個(gè)決策器投出贊成票就通過

    ConsensusBased          贊成票大于否決票就通過,相同也算是沒有通過授權(quán)

    UnanimousBased        一票否決制,也就是只要有一個(gè)表決器投否決票就算不通過

    因此對(duì)于上面的場(chǎng)景我們應(yīng)該選擇AffirmativeBased表決策略,在決策略下還要有兩個(gè)表決器,下面介紹表決器

    1

    posted @ 2011-03-31 19:07 張昊 閱讀(1982) | 評(píng)論 (1)編輯 收藏

    系統(tǒng)日志就是記錄管理員或用戶對(duì)系統(tǒng)的歷史操作信息,比如管理員添加或者修改、刪除一個(gè)角色,這些操作都可以記錄到系統(tǒng)日志表中,管理員可以通過“系統(tǒng)管理系統(tǒng)日志”菜單查詢?cè)敿?xì)的日志信息。

    系統(tǒng)日志的配置大致包括兩個(gè)方面:系統(tǒng)日志緩存配置和系統(tǒng)日志類型配置,此兩項(xiàng)配置信息在WEB-INF/config/appContext.xml

    ²        系統(tǒng)日志緩存配置:

    系統(tǒng)產(chǎn)生的日志默認(rèn)不是立即存入數(shù)據(jù)庫的,而是存入日志緩存中,緩存中的日志信息達(dá)到設(shè)定的緩存策略時(shí),系統(tǒng)將緩存中的日志信息存入數(shù)據(jù)庫,緩存策略配置目前支持按照緩存大小、時(shí)間、日志條數(shù)設(shè)置

    appContext.xml文件中找到如下配置

    <bean id="cacheProcessor" class="org.hi.base.sysapp.interceptor.LogSizeCacheProcessor">

               <property name="size" value="10"/>

    </bean>

    此處是按照緩存大小設(shè)置的緩存策略,此處的緩存大小設(shè)置的值為10M

    此行代碼下方有兩個(gè)類似的被注釋的配置如下:

    <!--

    <bean id="cacheProcessor" class="org.hi.base.sysapp.interceptor.LogTimerCacheProcessor">

        <property name="period" value="1"/>

    </bean>

    <bean id="cacheProcessor" class="org.hi.base.sysapp.interceptor.LogLengthCacheProcessor">

        <property name="length" value="10"/>

    </bean>

    -->

    此處兩項(xiàng)配置也是緩存策略的設(shè)置,第一項(xiàng)配置是按照時(shí)間設(shè)置緩存策略,此處的時(shí)間值為1分鐘,第二項(xiàng)配置是按照日志條數(shù)設(shè)置緩存策略,此處的日志條數(shù)值為10

    注意:以上三項(xiàng)配置只能保留一項(xiàng),也就是說當(dāng)系統(tǒng)運(yùn)行時(shí)只能選擇一種日志緩存策略

    ²        系統(tǒng)日志類型配置:

    系統(tǒng)日志類型根據(jù)操作的不同大概分為四種:添加和更新操作、刪除操作、查詢操作、其他操作,此四種類型分別對(duì)應(yīng)于WEB-INF/config/appContext.xml配置文件中的四項(xiàng)配置

    添加和更新操作

    <bean id="saveLogAnalysisor" class="org.hi.base.sysapp.interceptor.LogSaveAnalysisor"/>

    刪除操作

    <bean id="removeLogAnalysisor" class="org.hi.base.sysapp.interceptor.LogRemoveAnalysisor"/>

    查詢操作

    <bean id="searchLogAnalysisor" class="org.hi.base.sysapp.interceptor.LogSearchAnalysisor"/>

    其他操作

    <bean id="noknowLogAnalysisor" class="org.hi.base.sysapp.interceptor.LogNoknowAnalysisor"/>

    系統(tǒng)運(yùn)行時(shí),管理員可以根據(jù)關(guān)注的日志類型選擇其中的一項(xiàng)或者多項(xiàng),選擇好后將其配置到以下代碼處:

    <bean id="methodLogInterceptor" class="org.hi.base.sysapp.interceptor.MethodLogInterceptor">

               <property name="saveProcessor" ref="saveProcessor"/>

               <property name="cacheProcessor" ref="cacheProcessor"/>

               <property name="unincludeMethodNames">

                   <value>getEnumerations</value>

               </property>

               <property name="analysisors">

                   <list><!—- 此處配置日志類型 -->

                      <ref bean="saveLogAnalysisor"/>

                      <ref bean="removeLogAnalysisor"/>

                      <ref bean="noknowLogAnalysisor"/>

                   </list>

               </property>

    </bean>

    管理員可以將關(guān)注的日志類型添加到<property name="analysisors">下的<list>標(biāo)簽下,上面的代碼配置了三項(xiàng)日志類型,即添加和更新操作、刪除操作、其他操作產(chǎn)生的日志將會(huì)被記錄到數(shù)據(jù)庫,不建議將查詢操作日志類型添加進(jìn)去,因?yàn)椴樵儾僮鲗?huì)產(chǎn)生大量日志,不便于管理員找到自己關(guān)注的日志內(nèi)容,另外也會(huì)在較短時(shí)間內(nèi)占用大量的數(shù)據(jù)庫空間。

    設(shè)計(jì)分析:通過上面的配置文件可以看出,系統(tǒng)日志的設(shè)計(jì)思想通過Spring的方法攔截器(methodLogInterceptor),該攔截器又分大的三個(gè)部分,保存處理器(saveProcessor);緩存處理器(cacheProcessor);日志分析器(analysisors)。保存處理器,的工作是將日志保存到指定的持久化介質(zhì)中例如數(shù)據(jù)庫表或是XML等,目前平臺(tái)缺省提供的是保存到數(shù)據(jù)庫表中,當(dāng)然您也可以通過實(shí)現(xiàn)接口的方式自由控制日志保存的位置;緩存處理器,日志不是每生產(chǎn)一條就做一次保存的,而是通過緩存批量將日志信息保存起來,緩存處理器就是來完成日志的緩存功能,目前平臺(tái)提供3種緩存機(jī)制;日志分析器,因?yàn)閿?shù)據(jù)的增刪查改等操作的描述信息各不相同,所以日志分析器的作用是分析日志數(shù)據(jù)的描述格式以方面管理員閱讀日志。對(duì)于日志的處理流程來看,當(dāng)調(diào)用某個(gè)業(yè)務(wù)層方法時(shí)日志的方法攔截器就是攔截住該方法,首先通過方法的類型調(diào)用相應(yīng)日志分析器分析出日志描述信息與格式,然后將日志放到緩存中,緩存處理器會(huì)根據(jù)相應(yīng)的觸發(fā)條件,如果滿足條件就調(diào)用保存處理器將日志信息批量保存起來。




                                               注:該文檔由J-Hi愛好者"刀刀"提供,他的QQ號(hào)為150380807,歡迎大家與他在技術(shù)上多多交流

    posted @ 2011-03-30 20:51 張昊 閱讀(1875) | 評(píng)論 (2)編輯 收藏

         摘要: 目的 通過配置文件himenu-config.xml動(dòng)態(tài)裝配樹型結(jié)構(gòu),要求不對(duì)V端(JSP或Javascript)不做任何修改,樹的深度—深度包括兩層含義1組件與組件之間的關(guān)聯(lián)層次的深度2樹本身的層次的深層—不做任何限制,動(dòng)態(tài)—?jiǎng)討B(tài)也包括兩層含義1樹本身的數(shù)據(jù)是動(dòng)態(tài)的均應(yīng)從數(shù)據(jù)庫中調(diào)用2動(dòng)態(tài)加載即只有點(diǎn)擊當(dāng)前層的節(jié)點(diǎn)時(shí)才去加載當(dāng)前層的下一層數(shù)據(jù)—構(gòu)建,多語言的支持要求可配置—從數(shù)據(jù)庫取出的數(shù)據(jù)可以...  閱讀全文
    posted @ 2011-03-29 00:00 張昊 閱讀(1841) | 評(píng)論 (1)編輯 收藏

         摘要:     安全管理是最復(fù)雜也是最難以理解的功能模塊,理論上僅對(duì)系統(tǒng)管理員開放該功能。總的來看安全管理主要分為用戶管理、用戶權(quán)限、角色來分派權(quán)限。     在介紹安全管理之前,先讓我們對(duì)一些關(guān)鍵字有所了解。 關(guān)鍵詞: ü         ...  閱讀全文
    posted @ 2011-03-24 21:10 張昊 閱讀(3270) | 評(píng)論 (1)編輯 收藏

    您的產(chǎn)品能跟Apache,JBoss,Spring比么,是一個(gè)級(jí)別的東西么?他們的源代碼都是放在網(wǎng)站上隨便下載的,您的呢,還要填申請(qǐng),還要加入 群,怎么這么多破事兒啊!您平臺(tái)的開發(fā)工具用了Eclipse,IBM讓您加入群或者填申請(qǐng)了么,Eclipse的源代碼就放在IBM的網(wǎng)站上,隨便用, 誰都可以下載。看好,這才叫開源!到了中國的開源為什么就會(huì)這樣艱難呢?

           這位網(wǎng)友的言詞很犀利,但他還是給我們留了一些余地沒有把話說得那么明白。實(shí)際上這位網(wǎng)友的想說的不過是,你為什么要采用這樣的開源模式?你到底想賺錢還是想開源?下面我針對(duì)這些問題逐一回答,如果我的理解有不當(dāng)之處,也請(qǐng)各位網(wǎng)友提出自己的見解。

           首先,優(yōu)秀的開源項(xiàng)目是一個(gè)綜合性的問題,它不僅包括技術(shù)與產(chǎn)品本身還包括:

    1、 合理的推廣模式,例如Rod Johnson在推出Spring之前已為Spring的思想打下了堅(jiān)實(shí)的基礎(chǔ)寫了好幾本J2EE的書,這種影響力甚至深遠(yuǎn)到很多人都排斥EJB,以及于Spring一推出就受到了很多人的關(guān)注。當(dāng)然我用Spring只是舉個(gè)例子,推廣有很多種形式但什么形式更適合J-Hi呢?我們還在探索。

    2、 及時(shí)、有效的服務(wù)支持,例如JBoss這是免費(fèi)的也是開源的,但它有優(yōu)質(zhì)的服務(wù)。7*24小時(shí)全年無休的為使用者解決實(shí)際問題。當(dāng)然服務(wù)還包括很多大量的文檔、清晰易懂的視頻、有針對(duì)象的用例程序、可參考的運(yùn)行系統(tǒng)、現(xiàn)場(chǎng)的技術(shù)支持等等。由此可見,服務(wù)是一個(gè)復(fù)雜的工程,需要投入大量的人力、物力、財(cái)力。

    3、 有自身生存的條件,縱觀很多開源項(xiàng)目與開源組織有很好的產(chǎn)品但還是半路夭折了。例如opensymphony組織,可能大家不熟但他們的產(chǎn)品我想大家都知道:webworkognlosworkflowosCache。我們以webwork為例,它在Struts1.X時(shí)就與之爭(zhēng)占市場(chǎng),最終還是敗下陣來,甚至Struts2只是在webwork內(nèi)核之上披上了一層外衣。究其原因是什么,為什么opensymphony組織失去了生命力,我覺得最主要的原因還是來自于自身,沒有最起碼的生存條件作為基礎(chǔ)。實(shí)際上開源項(xiàng)目面臨最重要的問題就是生存問題。只要是開源的參與者,都有一顆關(guān)愛他人與他人分享成果的心。然而做一件事情并且要長期的堅(jiān)持下去只有激情還是遠(yuǎn)遠(yuǎn)不夠的,我一直認(rèn)為只有吃飽肚子才能干開源,而吃飽肚子是生存的前提。

    4、 有基金或資金的支持,強(qiáng)而用力的基金與資金的支持是開源很重要的因素,比如Apache背后有無數(shù)的大企業(yè)的捐贈(zèng)與資助,而在中國我們沒有這個(gè)條件。再說深一點(diǎn),webwork賣給了apachehibernate賣給了JBoss,起碼這些產(chǎn)品賣出后還在繼續(xù)開源繼續(xù)維護(hù),反過來看我們能賣給誰,即使是賣了還能再開源碼?

    總結(jié)上述幾點(diǎn)可以看出,我們ApacheJBossSpring確實(shí)不能比不但不能比技術(shù)而且在所有的條件下都沒法比。就是因?yàn)闆]法比所以我們也在探索一條適合中國國情的開源的路(采用這樣的開源模式),我們從不否認(rèn)自己的商業(yè)性,也不想否則。原因很簡(jiǎn)單,那就是生存,不過有一個(gè)論點(diǎn)我倒是想明確一下,我們不是為了想賺錢才開源,而是想開源必須要賺錢!

    其次,開源項(xiàng)目是個(gè)長期的堅(jiān)持不懈的過程,前一陣子流行一句話 “剩者為王”,那么如何才能成為“剩者”呢?一個(gè)開源項(xiàng)目如果要有長久的生命力,不是只靠一個(gè)團(tuán)隊(duì)或幾個(gè)人事(幾個(gè)人是做不過來這么多事情的),還要有推廣(要有廣告投入吧);要有服務(wù)(要有支持人員吧);要有收益(要支付人員工資吧)等等,真正的“剩者”就是能生存下來的人,如果生存都成為問題,何談長期與堅(jiān)持不懈呢?

    最后,中國的開源不但需要大家的理解與支持,更需要大家的參與,有問題可以說出你的意見與解決方案,而不是批評(píng)與指責(zé)。如果真要這么說的話,那么我們已經(jīng)把我們五年的勞動(dòng)成果分享給大家,而您又為別人做了些什么呢?中國的開源以及中國開源所應(yīng)采取的何種模式運(yùn)作才算是合理?這是一道非常有深度的問題。我真心的希望大家在看到這篇文章后能發(fā)表一下自己的意見與建意。實(shí)質(zhì)的問題的核心就是“在中國如何能在開源的前提下又能保證生存與發(fā)展

    posted @ 2011-03-22 18:03 張昊 閱讀(1810) | 評(píng)論 (2)編輯 收藏

    cquireIncrement[3]         當(dāng)連接池中的連接耗盡的時(shí)候c3p0一次同時(shí)獲取的連接數(shù)

    acquireRetryAttempts[30]    定義在從數(shù)據(jù)庫獲取新連接失敗后重復(fù)嘗試的次數(shù)

    acquireRetryDelay[1000]     兩次連接中間隔時(shí)間,單位毫秒

    autoCommitOnClose[false]    連接關(guān)閉時(shí)默認(rèn)將所有未提交的操作回滾

    automaticTestTable[null] 如果值為Test則c3p0將建一張名為Test的空表,并使用其自帶的查詢語句進(jìn)行測(cè)試。如果定義了這個(gè)參數(shù)那么屬性preferredTestQuery將被忽略。你不能在這張Test表上進(jìn)行任何操作,它將只供c3p0測(cè)試使用

    breakAfterAcquireFailure[false]      獲取連接失敗將會(huì)引起所有等待連接池來獲取連接的線程拋出異常。但是數(shù)據(jù)源仍有效保留,并在下次調(diào)用getConnection()的時(shí)候繼續(xù)嘗試獲取連接。如果設(shè)為true,那么在嘗試獲取連接失敗后該數(shù)據(jù)源將申明已斷開并永久關(guān)閉

    checkoutTimeout[0]              當(dāng)連接池用完時(shí)客戶端調(diào)用getConnection()后等待獲取新連接的時(shí)間,超時(shí)后將拋出SQLException,如設(shè)為0則無限期等待

    connectionTesterClassName[com.mchange.v2.c3p0.impl.DefaultConnectionTester]                      通過實(shí)現(xiàn)ConnectionTester或QueryConnectionTester的類來測(cè)試連接。類名需制定全路徑

    factoryClassLocation[null]             指定c3p0 libraries的路徑,如果(通常都是這樣)在本地即可獲得那么無需設(shè)置

    forceIgnoreUnresolvedTransactions [false]    建議不使用的一個(gè)屬性,如果為true時(shí)允許有程序bug在事務(wù)中

    idleConnectionTestPeriod[0]   每隔X秒檢查所有連接池中的空閑連接

    initialPoolSize[3]     初始化時(shí)獲取三個(gè)連接,取值應(yīng)在minPoolSize與maxPoolSize之間

    maxIdleTime[0]            最大空閑時(shí)間(秒),X秒內(nèi)未使用則連接被丟棄。若為0則永不丟棄

    maxPoolSize[15]    連接池中保留的最大連接數(shù)

    maxStatements[0]  JDBC的標(biāo)準(zhǔn)參數(shù),用以控制數(shù)據(jù)源內(nèi)加載的PreparedStatements數(shù)量。但由于預(yù)緩存的statements屬于單個(gè) connection而不是整個(gè)連接池。所以設(shè)置這個(gè)參數(shù)需要考慮到多方面的因素。如果maxStatements與 maxStatementsPerConnection均為0,則緩存被關(guān)閉

    maxStatementsPerConnection[0]          maxStatementsPerConnection定義了連接池內(nèi)單個(gè)連接所擁有的最大緩存statements數(shù)

    numHelperThreads[3]           c3p0是異步操作的,緩慢的JDBC操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能
    通過多線程實(shí)現(xiàn)多個(gè)操作同時(shí)被執(zhí)行

    overrideDefaultUser[null]       當(dāng)用戶調(diào)用getConnection()時(shí)使root用戶成為去獲取連接的用戶。主要用于連接池連接非c3p0的數(shù)據(jù)源時(shí)

    overrideDefaultPassword[null] 與overrideDefaultUser參數(shù)對(duì)應(yīng)使用的一個(gè)參數(shù)

    password[null]        密碼

    preferredTestQuery[null]        定義所有連接測(cè)試都執(zhí)行的測(cè)試語句。在使用連接測(cè)試的情況下這個(gè)一顯著提高測(cè)試速度。注意:測(cè)試的表必須在初始數(shù)據(jù)源的時(shí)候就存在

    propertyCycle[300]         用戶修改系統(tǒng)配置參數(shù)執(zhí)行前最多等待300秒

    testConnectionOnCheckout[false]  因性能消耗大請(qǐng)只在需要的時(shí)候使用它。如果設(shè)為true那么在每個(gè)connection提交的時(shí)候都將校驗(yàn)其有效性。建議使用idleConnectionTestPeriod或automaticTestTable等方法來提升連接測(cè)試的性能

    testConnectionOnCheckin[false]           如果設(shè)為true那么在取得連接的同時(shí)將校驗(yàn)連接的有效性

    user[null]        用戶名

    usesTraditionalReflectiveProxies[false]         期的c3p0版本對(duì)JDBC接口采用動(dòng)態(tài)反射代理。在早期版本用途廣泛的情況下這個(gè)參數(shù)允許用戶恢復(fù)到動(dòng)態(tài)反射代理以解決不穩(wěn)定的故障。最新的非反射代理更快并且已經(jīng)開始廣泛的被使用,所以這個(gè)參數(shù)未必有用。現(xiàn)在原先的動(dòng)態(tài)反射與新的非反射代理同時(shí)受到支持,但今后可能的版本可能不支持動(dòng)態(tài)反射代理

    posted @ 2011-03-21 19:58 張昊 閱讀(2018) | 評(píng)論 (0)編輯 收藏



    VISO及JPG文件在附件中:
    http://www.tkk7.com/Files/hao-zhang-hi/SpringContainerCalss.rar


    posted @ 2011-03-19 23:41 張昊 閱讀(2761) | 評(píng)論 (3)編輯 收藏

           我覺得從廣義上來講,“平臺(tái)”這個(gè)詞應(yīng)該是承載事物的環(huán)境或?qū)嶓w。比如我們說某某電子商務(wù)平臺(tái)更多的體現(xiàn)在它的環(huán)境上,而當(dāng)我們說觀景平臺(tái)時(shí)更多的體現(xiàn)在它是一個(gè)物理的實(shí)體上。不過無論是環(huán)境也好實(shí)體也罷,雖然在應(yīng)用領(lǐng)域上會(huì)千差萬別,但它們都有一個(gè)共同的特性,即平臺(tái)是一個(gè)載體。讓人或信息工作的更高效,從本質(zhì)來看,好像平臺(tái)更像是一種傳統(tǒng)模式的有有益的補(bǔ)充,而非必須要有的。比如以電子商務(wù)平臺(tái)為例,沒有電子商務(wù)平臺(tái)人們就不能交易了嘛?好像不是這樣。我這樣說并不是說平臺(tái)是可有可無的東西,而是說有了平臺(tái)會(huì)使人家更效、舒適的生活。反過來說,平臺(tái)是對(duì)我們生活模式的有益補(bǔ)充。既然平臺(tái)是一個(gè)承載體,所以理論來說它并不應(yīng)該限制人們的習(xí)慣或方式,比如誰說觀景平臺(tái)就只能看風(fēng)景,我在它上面吃飯不可以嘛?這當(dāng)然是沒有問題的(雖然這樣做有些不合適,但沒人會(huì)說這是不可以的)。

           由上述對(duì)廣義對(duì)平臺(tái)的共同性特點(diǎn)來反觀技術(shù)平臺(tái),好像在技術(shù)領(lǐng)域平臺(tái)這個(gè)詞很模糊javanet說自己是平臺(tái),還有一些以模型驅(qū)動(dòng)的軟件企業(yè)也說自己的產(chǎn)品是平臺(tái),在國內(nèi)一些幾個(gè)開源框架搭建起來帶一些業(yè)務(wù)模型功能的也稱自己是平臺(tái)。對(duì)此我們應(yīng)該簡(jiǎn)單的梳理一下:在技術(shù)領(lǐng)域好像平臺(tái)是一個(gè)相對(duì)的概念,以java為例,java平臺(tái)作為底層支撐著上述其它的平臺(tái)。

           在此我不想評(píng)價(jià)各個(gè)平臺(tái)類產(chǎn)品的優(yōu)劣,只是覺得國內(nèi)的平臺(tái)做得還不夠好,這種不好不只是指技術(shù)還包括市場(chǎng)的運(yùn)作模式、開放程序等方面。下面我說一下我夢(mèng)想中的平臺(tái)應(yīng)該是個(gè)什么樣子:

    1、 平臺(tái)應(yīng)該是開源的,既然是平臺(tái)就應(yīng)該有一個(gè)開放的心態(tài),這樣才能使更多的人在平臺(tái)上去開發(fā)相應(yīng)的產(chǎn)品,才會(huì)有更多的用戶群。像java語言為什么會(huì)遠(yuǎn)遠(yuǎn)多于其它語言的使用者,其主要原因就是它開源,開放標(biāo)準(zhǔn),從而在框架類產(chǎn)品中形成百家爭(zhēng)鳴的盛況,并且這種趨勢(shì)并沒減退還在繼續(xù)——即使Oracle收購了Sun。由此我們可以看出一個(gè)開放性的平臺(tái),用戶群足夠多、技術(shù)足夠公開,那么它的發(fā)展方向并不是由一家或幾家大公司可以掌控的,平臺(tái)的開放性將是一種趨勢(shì)。

    2、 平臺(tái)應(yīng)該是高效的,平臺(tái)的最終目的就是提高生產(chǎn)力降低成本。首先從技術(shù)角度分析,它要足夠的快速,從而降低開發(fā)成本;它要足夠的簡(jiǎn)單易用,從而降低學(xué)習(xí)成本;它要適應(yīng)已有的開發(fā)習(xí)慣與管理方式,從而降低風(fēng)險(xiǎn)成本;它要有足夠的抽象性與復(fù)用性(即使是以平臺(tái)開發(fā)出的產(chǎn)品也是一樣),從而降低重復(fù)勞動(dòng)。其次,提高生產(chǎn)力降低成本是一個(gè)綜合性的問題。平臺(tái)應(yīng)該不只是一個(gè)開發(fā)工具,應(yīng)該是對(duì)應(yīng)項(xiàng)目全生命期過程建立起自己的思想體系與解決方案,從而在整個(gè)項(xiàng)目周期內(nèi)的每個(gè)環(huán)節(jié)都體現(xiàn)出它作用。例如從項(xiàng)目立項(xiàng)開始應(yīng)該大體分為簽定合同à需求調(diào)研à概要設(shè)計(jì)à詳細(xì)設(shè)計(jì)à開發(fā)à測(cè)試à部署上線 (發(fā)布)à需求變更等,好的平臺(tái)應(yīng)該是對(duì)項(xiàng)目的全過程進(jìn)行管理,例如現(xiàn)在項(xiàng)目開發(fā)存在一個(gè)很大的問題就是文檔與代碼不同步;再如測(cè)試用例與測(cè)試的覆蓋率很低甚至沒有測(cè)試代碼或測(cè)試文檔;再再如目前大多平臺(tái)都沒有整合打包的部署工具(跨操作系統(tǒng)、跨數(shù)據(jù)庫、跨應(yīng)用服務(wù)器),一鍵式遠(yuǎn)程部署;最后需求的變更也是頭痛的問題,平臺(tái)是如何適應(yīng)不斷的需求變化的,大多平臺(tái)均沒有合理的解決方案。因此可以看出,平臺(tái)是一個(gè)綜合性的工程,僅解決一、兩個(gè)點(diǎn)上的問題是不足以從根本上提高生產(chǎn)力降低成本的。

    3、 平臺(tái)的技術(shù)是可選擇的,我們前面說過平臺(tái)它只是個(gè)載體,至于在這個(gè)載體上放些什么,怎么去搭配使用,平臺(tái)應(yīng)該為使用者提供各種可選擇的權(quán)力,甚至是可擴(kuò)展、可插拔的條件。每個(gè)使用者都有自己各自的技術(shù)傾向性,這種傾向性有可能是他對(duì)某種技術(shù)的熟練程度,或者是出去于具體業(yè)務(wù)所采用技術(shù)的適應(yīng)性。總之平臺(tái)應(yīng)該適應(yīng)這種傾向性,它不應(yīng)該拘泥于某種技術(shù)或某個(gè)框架,把這些選擇權(quán)開放給使用者,使自己成為一個(gè)容器或是一個(gè)載體這才是平臺(tái)最應(yīng)關(guān)注的東西。

    4、 平臺(tái)之上的平臺(tái),從本質(zhì)來看平臺(tái)還是個(gè)實(shí)體是個(gè)工具,是人與機(jī)器的交流,而非人與人的交流。我覺得好的平臺(tái)除了人與機(jī)器的交流外,更應(yīng)該是一個(gè)社區(qū)一個(gè)人與人交流的平臺(tái),這樣大家可以在這個(gè)平臺(tái)實(shí)現(xiàn)資源共享,分享勞動(dòng)成果。只有形成一個(gè)開放的生態(tài)社區(qū)或生態(tài)環(huán)境,大多數(shù)人都能融入其中,大家可以在這樣平臺(tái)之上的平臺(tái)上共同工作,從而實(shí)現(xiàn)雙贏,使每個(gè)付出的人都有收益。

    posted @ 2011-03-18 16:41 張昊 閱讀(1726) | 評(píng)論 (1)編輯 收藏

    僅列出標(biāo)題
    共5頁: 上一頁 1 2 3 4 5 下一頁 
    主站蜘蛛池模板: 免费看大美女大黄大色| 亚洲午夜久久久影院伊人| 亚州免费一级毛片| 99免费在线观看视频| 亚洲爆乳少妇无码激情| 亚洲AV人人澡人人爽人人夜夜| 日产国产精品亚洲系列| 日韩中文字幕精品免费一区| 日本免费一区二区在线观看| 中文字幕无码视频手机免费看| 国产无人区码卡二卡三卡免费| 2021久久精品免费观看| 三年片在线观看免费| a毛片免费全部播放完整成| 国产精品偷伦视频观看免费| 日日躁狠狠躁狠狠爱免费视频| 亚洲精品无码久久久久牙蜜区| 亚洲精品福利网泷泽萝拉| 亚洲精品视频专区| 亚洲卡一卡二卡乱码新区| 亚洲欧美综合精品成人导航| 最新亚洲人成网站在线观看| 在线播放免费人成视频网站| 精品视频在线免费观看| 4399影视免费观看高清直播| 三上悠亚在线观看免费| 人与动性xxxxx免费| a级毛片免费完整视频| 99xxoo视频在线永久免费观看| 18国产精品白浆在线观看免费| 最近2019中文字幕mv免费看| 免费在线视频一区| 亚洲区小说区图片区QVOD| 久久亚洲sm情趣捆绑调教| 亚洲第一街区偷拍街拍| 少妇亚洲免费精品| 久久成人免费播放网站| 免费无码一区二区三区| 四虎永久在线精品免费网址| 亚洲成在人线aⅴ免费毛片| 免费成人午夜视频|