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

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

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

    俊星的BLOG

    2009年6月5日 #

    實現(xiàn)變更統(tǒng)計

    1、在本地數(shù)據(jù)庫中創(chuàng)建如下表:
    -- Create table
    create table TMP_CR_PERSONS
    (
      SPECIALTY     VARCHAR2(50),
      USER_GROUP    VARCHAR2(50),
      USER_NAME     VARCHAR2(50),
      USER_CATEGORY VARCHAR2(50)
    )

    2、創(chuàng)建DBLINK:
     
      create database link LK2PMS connect to XXX identified by XX
      using '(DESCRIPTION =
        (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.5.99)(PORT = 1521))
        )
        (CONNECT_DATA =
          (SERVER = DEDICATED)
          (SERVICE_NAME = oradb9)
        )
      )'

    3、創(chuàng)建視圖,查詢變更清單:
    CREATE OR REPLACE VIEW V_TMP_CR_LIST AS
    SELECT D.CHANGE_REQUEST_CODE,
           D.PROJECT_NAME,
           D.PRODUCT_NAME,
           D.MODULE_NAME,
           D.TYPE,
           D.PRIVILEGE,
           D.PROPOSE_TIME,
           WF.TRANSACTOR,
           WF.TASKNAME,
           P.SPECIALTY,
           P.USER_GROUP,
           P.USER_CATEGORY
      FROM PMS_CHANGE@lk2pms D,
           (SELECT MAX(ID) ID
              FROM WFT_FLOWCONTROL@lk2pms WF
             WHERE WF.WORKFLOWID = 'ChangeRequest'
             GROUP BY WF.WORKID) MX,
           WFT_FLOWCONTROL@lk2pms WF,
           TMP_CR_PERSONS P
     WHERE WF.ID = MX.ID
       AND WF.WORKID = D.CHANGE_REQUEST_ID
       AND D.CHANGE_REQUEST_CODE LIKE 'CR%'
       AND WF.TRANSACTOR = P.USER_NAME
       AND D.STATE NOT IN ('結(jié)束','終止','拒絕');


    4、創(chuàng)建統(tǒng)計視圖:
    CREATE VIEW V_TMP_CR_STAT AS
    SELECT T.USER_GROUP, T.USER_NAME, COUNT(V.CHANGE_REQUEST_CODE) TOTAL
      FROM V_TMP_CR_LIST V, TMP_CR_PERSONS T
     WHERE V.TRANSACTOR(+) = T.USER_NAME
     GROUP BY CUBE(T.USER_GROUP, T.USER_NAME);

    posted @ 2010-11-22 09:09 俊星 閱讀(295) | 評論 (0)編輯 收藏

    切換IE8中碰到的問題

    1、當(dāng)然是訪問老系統(tǒng)中的,應(yīng)該都采用兼容視圖
    2、在訪問網(wǎng)公司系統(tǒng)的時候,出現(xiàn)內(nèi)存不能寫的錯誤提示,讓后直接頁面加載失敗,解決辦法是,找到用SOGOU瀏覽器加載頁面后,發(fā)現(xiàn)需要安裝JITDSign這個插件,所以手工找到JITDSign.cab,解壓后直接運行“regsvr32  JITDSign.ocx”,再刷新頁面,OK了。

    3、其他問題暫未發(fā)現(xiàn)。

    posted @ 2010-11-10 10:04 俊星 閱讀(344) | 評論 (0)編輯 收藏

    發(fā)布FWMS

    1、利用命令“D:\FWMS\code\trunk\main\ear\ejb>dir /a:d /b”,列舉出所有的EJB模塊清單

    2、結(jié)合上面的清單,結(jié)合正則“^(.*)$”,替換為“<ant antfile="${FWMS_code}/ear/ejb/$1/META-INF/build.xml" dir="${FWMS_code}/ear/ejb/$1/META-INF" target="ejbdoclet"/>”形式,并將得到的ant元素清單放置到工程下build.xml的“Generating_Code”target中。

    3、基于如下正則,利用UE批量替換properties文件中的project.path:
    查找:(project.path.*)
    目標(biāo):project.path=../../../APP-INF/classes;../../../APP-INF/lib/activation.jar;../../../APP-INF/lib/ant.jar;../../../APP-INF/lib/apachepoi.jar;../../../APP-INF/lib/axis.jar;../../../APP-INF/lib/axis-ant.jar;../../../APP-INF/lib/bsh2.0.jar;../../../APP-INF/lib/classes12.zip;../../../APP-INF/lib/commons-
    文件:build.properties
    路徑:D:\FWMS\code\trunk\main\ear\ejb\
    (注意需要選中搜索子目錄項)

    4、上述完成之后,執(zhí)行build_code.bat 即可完成EJB的編譯

    5、設(shè)置ct-config.xml中相關(guān)內(nèi)容,最后是啟動weblogic 并設(shè)置數(shù)據(jù)源,同時發(fā)布應(yīng)用。

    6、發(fā)布啟動weblogic的時候,報“java.lang.OutOfMemoryError: PermGen space”異常,在C:\bea\weblogic92\common\bin的commEnv.cmd中,查看到其內(nèi)存設(shè)置為“set MEM_ARGS=-Xms128m -Xmx256m”;在C:\bea\user_projects\domains\fwms_domain\bin下startWebLogic.cmd中,添加“set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=128m”,適當(dāng)加大內(nèi)存。

    posted @ 2010-11-09 11:59 俊星 閱讀(462) | 評論 (0)編輯 收藏

    ActiveMQ初探

    Apache ActiveMQ是一個高性能的消息代理,實現(xiàn)了JMS 1.1。
    目前的最新版本是5.4.1
    1、下載相關(guān)包,并將activemq-all-5.4.1.jar加入到工程中。

    2、運行bin目錄下的actionmq.bat文件,啟動broker,在conf下是相關(guān)的配置文件,例如activemq.xml

    3、可通過訪問http://localhost:8161/admin/來查看啟動情況,有可通過netstat -an|find "61616" 來查看端口,因為通過查看activemq.xml中即可發(fā)現(xiàn)傳輸連接器即配置的占用61616端口:
    <transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
     </transportConnectors>

    4、編寫消息接收類:
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageConsumer;
    import javax.jms.Session;
    import javax.jms.TextMessage;

    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;

    public class JmsReceiver {
        
    public static void main(String[] args) throws JMSException {
            ConnectionFactory connectionFactory 
    = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, 
    "tcp://localhost:61616");
            Connection connection 
    = connectionFactory.createConnection();
            connection.start();
            Session session 
    = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            
    // 需要在activemq的控制臺中創(chuàng)建queue:testqueue
            Destination destination = session.createQueue("testqueue");
            MessageConsumer consumer 
    = session.createConsumer(destination);
            
            
    while (true{
                TextMessage message 
    = (TextMessage) consumer.receive(1000);
                
    if (null != message)
                    System.out.println(
    "收到消息:" + message.getText());
                
    else
                    
    break;
            }

            session.close();
            connection.close();
        }

    }


    5、編寫消息產(chǎn)生類:
    import javax.jms.Connection;
    import javax.jms.ConnectionFactory;
    import javax.jms.DeliveryMode;
    import javax.jms.Destination;
    import javax.jms.JMSException;
    import javax.jms.MessageProducer;
    import javax.jms.Session;
    import javax.jms.TextMessage;

    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.ActiveMQConnectionFactory;

    public class JmsSender {
        
    public static void main(String[] args) throws JMSException {
            ConnectionFactory connectionFactory 
    = new ActiveMQConnectionFactory(ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD, 
    "tcp://localhost:61616");
            Connection connection 
    = connectionFactory.createConnection();
            connection.start();
            Session session 
    = connection.createSession(Boolean.TRUE, Session.AUTO_ACKNOWLEDGE);
            Destination destination 
    = session.createQueue("testqueue");
            MessageProducer producer 
    = session.createProducer(destination);
            producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
            sendMsg(session, producer);
            session.commit();
            connection.close();
        }


        
    public static void sendMsg(Session session, MessageProducer producer) throws JMSException {
            
    // 創(chuàng)建一條文本消息
            TextMessage message = session.createTextMessage("你好 ActiveMQ!");
            producer.send(message);
            System.out.println(
    "");
        }

    }


    6、通過訪問http://localhost:8161/admin/,在queue中創(chuàng)建testqueue,先執(zhí)行消息發(fā)送類,后執(zhí)行消息接收類,借看看到消息接收類的如下執(zhí)行結(jié)果:
    收到消息:你好 ActiveMQ!
    收到消息:你好 ActiveMQ!

    (執(zhí)行多次消息發(fā)送類,則會接受到多條“你好 ActiveMQ!”消息)

    posted @ 2010-10-28 17:53 俊星 閱讀(2905) | 評論 (1)編輯 收藏

    CAS初步配置

    此處的CAS是指Central Authentication Service,也即統(tǒng)一認(rèn)真服務(wù),這里采用的是JASIG提供的相關(guān)服務(wù)端及客戶端類庫,結(jié)合TOMCAT進(jìn)行測試。

    1、下載相關(guān)的服務(wù)器端和客戶端類庫,官網(wǎng)是:http://www.jasig.org/cas/,目前我采用的是:
    服務(wù)器端:cas-server-3.3.4-release.zip
    客戶端:cas-client-2.0.11.zip

    2、配置TOMCAT的SSL,具體可見上一篇博文:
    在%CATALINA_HOME%/conf/server.xml中,添加:
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
                   maxThreads="150" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS"
                   keystoreFile="F:\eclipse\workspace\httpc\tomcat3.keystore"
                   keystorePass="123456"/>
    配置OK后,可通過訪問“https://localhost:8443/examples/servlets/servlet/HelloWorldExample”來進(jìn)行驗證

    3、配置CAS服務(wù)器端:
    將cas-server-3.3.4-release.zip中modules文件夾下的cas-server-webapp-3.3.4.war的解壓到TOMCAT的webapps目錄下。
    重啟TOMCAT后,可以通過訪問“http://localhost:8080/cas/login”并輸入相同的用戶名密碼來進(jìn)行驗證。
    另:需要特別說明,cas應(yīng)用中默認(rèn)配置的是SimpleTestUsernamePasswordAuthenticationHandler,該處理類只要保持用戶名、密碼一直即可通過驗證。

    4、配置CAS客戶端:
    在webapps\examples\WEB-INF中,對web.xml添加如下內(nèi)容:
    <filter>
       <filter-name>CAS Filter</filter-name>
       <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
       <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
         <param-value>https://localhost:8443/cas/login</param-value>
       </init-param>
       <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
         <param-value>https://localhost:8443/cas/serviceValidate</param-value>
       </init-param>
       <init-param>
         <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
         <param-value>localhost:8080</param-value>
       </init-param>
      </filter>
      <filter-mapping>
       <filter-name>CAS Filter</filter-name>
       <url-pattern>/servlets/servlet/HelloWorldExample</url-pattern>
      </filter-mapping>
    同時,將cas-client-2.0.11.zip中的casclient.jar,拷貝到webapps\examples\WEB-INF\lib中,重啟TOMCAT即可進(jìn)行驗證。

    5、驗證CAS:
    a、在瀏覽器中訪問“http://localhost:8080/examples/servlets/servlet/HelloWorldExample”
    b、基于前面配置的過濾器,瀏覽器會定向CAS的認(rèn)證頁面“https://localhost:8443/cas/login?service=http%3A%2F%2Flocalhost%3A8080%2Fexamples%2Fservlets%2Fservlet%2FHelloWorldExample”
    c、在CAS的認(rèn)證頁面中輸入相同的用戶名密碼test/test后,執(zhí)行登錄
    d、瀏覽器提示安全警告,點擊確定后即轉(zhuǎn)入到“http://localhost:8080/examples/servlets/servlet/HelloWorldExample?ticket=ST-1-xWK9nwArDLbjCwYiXOqu-cas”,同時頁面打出“Hello World”,配置成功。

    posted @ 2010-10-26 14:36 俊星 閱讀(739) | 評論 (0)編輯 收藏

    HTTP Client及HTTPS初探

    HTTP Client是一個客戶端HTTP協(xié)議的類庫
    1、首先是下載APACHE HTTP CLIENT相關(guān)的JAR,目前我引入到工程中的相關(guān)文件時:
    httpclient-4.0.3.jar
    httpcore-4.0.1.jar
    httpmime-4.0.3.jar
    commons-codec-1.4.jar
    commons-logging-1.1.1.jar

    JAR包之前的引用關(guān)系在README等相關(guān)說明中已有。

    2、下載并運行TOMCAT,我下載的是TOMCAT6(對應(yīng)的是JDK5),主要注意的是需要配置CATALINA_HOME這個環(huán)境變量。

    3、制作服務(wù)器端證書,下面是我一個示例:
    C:\Documents and Settings\dingjunxing>keytool -genkey -alias tomcat3 -keystore F
    :\eclipse\workspace\httpc\tomcat3.keystore
    輸入keystore密碼:  
    123456
    您的名字與姓氏是什么?
      [Unknown]:  localhost
    您的組織單位名稱是什么?
      [Unknown]:  sz
    您的組織名稱是什么?
      [Unknown]:  sz
    您所在的城市或區(qū)域名稱是什么?
      [Unknown]:  shenzhen
    您所在的州或省份名稱是什么?
      [Unknown]:  guangdong
    該單位的兩字母國家代碼是什么
      [Unknown]:  cn
    CN
    =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn 正確嗎?
      [否]:  y
    輸入
    <tomcat3>的主密碼
            (如果和 keystore 密碼相同,按回車):  
    123456

    4、根據(jù)服務(wù)器證書導(dǎo)出客戶端證書,有兩種方式,一種為采用IE,下面提供一個利用KEY TOOL導(dǎo)出的方式:
    keytool -export -file tomcat3.cert -alias tomcat3 -keystore F:\eclipse\workspace\httpc\tomcat3.keystore
    注意:上面命令行必須進(jìn)入到
    %java_home%/jre/lib/security中。

    5、將獲取到的客戶端證書導(dǎo)入:
    C:\Program Files\Java\jdk1.5.0_15\jre\lib\security>keytool -import -keystore cac
    erts 
    -file F:\eclipse\workspace\httpc\tomcat3.cert
    輸入keystore密碼:  
    123456
    Owner: CN
    =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
    發(fā)照者: CN
    =localhost, OU=sz, O=sz, L=shenzhen, ST=guangdong, C=cn
    序號: 4cc55438
    有效期間: Mon Oct 
    25 17:56:08 CST 2010 至: Sun Jan 23 17:56:08 CST 2011
    認(rèn)證指紋:
             MD5:  E4:2E:BE:AC:A1:5D:E0:
    95:C7:95:93:BF:B3:F3:EE:5E
             SHA1: F8:9A:BB:FA:C8:C5:8A:D2:FA:
    98:A1:95:64:65:42:9A:8F:0B:4A:7D
    信任這個認(rèn)證? [否]:  y
    認(rèn)證已添加至keystore中

    6、TOMCAT中相關(guān)設(shè)置,主要是修改CATALINA_HOME下的conf/server.xml,在其中添加如下一個連接器:
    <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
                   maxThreads
    ="150" scheme="https" secure="true"
                   clientAuth
    ="false" sslProtocol="TLS" keystoreFile="F:\eclipse\workspace\httpc\tomcat3.keystore" keystorePass="123456"/>    

    7、運行相關(guān)代碼:
    package org.apache.http.examples.client;

    import java.io.File;
    import java.io.FileInputStream;
    import java.security.KeyStore;

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.impl.client.DefaultHttpClient;

    /**
     * This example demonstrates how to create secure connections with a custom SSL
     * context.
     
    */
    public class ClientCustomSSL {

        
    public static void main(String[] args) throws Exception {
            DefaultHttpClient httpclient 
    = new DefaultHttpClient();

            KeyStore trustStore 
    = KeyStore.getInstance(KeyStore.getDefaultType());
            FileInputStream instream 
    = new FileInputStream(new File("tomcat3.keystore"));
            
    try {
                trustStore.load(instream, 
    "123456".toCharArray());
            } 
    finally {
                instream.close();
            }

            SSLSocketFactory socketFactory 
    = new SSLSocketFactory(trustStore);
            Scheme sch 
    = new Scheme("https", socketFactory, 8443);
            httpclient.getConnectionManager().getSchemeRegistry().register(sch);

            HttpGet httpget 
    = new HttpGet("https://localhost:8443/docs");

            System.out.println(
    "executing request" + httpget.getRequestLine());

            HttpResponse response 
    = httpclient.execute(httpget);
            HttpEntity entity 
    = response.getEntity();

            System.out.println(
    "----------------------------------------");
            System.out.println(response.getStatusLine());
            
    if (entity != null) {
                System.out.println(
    "Response content length: " + entity.getContentLength());
            }
            
    if (entity != null) {
                entity.consumeContent();
            }

            
    // When HttpClient instance is no longer needed,
            
    // shut down the connection manager to ensure
            
    // immediate deallocation of all system resources
            httpclient.getConnectionManager().shutdown();
        }

    }
    運行結(jié)果正常,當(dāng)然也可以通過在瀏覽器中輸入“https://localhost:8443/”的方式進(jìn)行訪問。

    posted @ 2010-10-25 20:13 俊星 閱讀(1989) | 評論 (2)編輯 收藏

    CAS認(rèn)證初探

    在網(wǎng)上找到一份比較老的參考文檔:http://www.ibm.com/developerworks/cn/webservices/ws-casestudy/part4/

    1、列舉出來其需要的幾項功能:

    該服務(wù)主要需要具備三項功能:

    1. 用戶注冊:用戶在統(tǒng)一身份認(rèn)證服務(wù)中注冊帳號,以后這個帳號可以在所有使用統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng)中使用。
    2. 帳號關(guān)聯(lián):如果用戶之前已經(jīng)在相關(guān)的應(yīng)用系統(tǒng)中擁有帳號,同時也已經(jīng)設(shè)置了相應(yīng)的權(quán)限,那么用戶能夠?qū)⑦@些應(yīng)用 系統(tǒng)的帳號與統(tǒng)一身份認(rèn)證服務(wù)的帳號進(jìn)行關(guān)聯(lián),使得用戶登錄統(tǒng)一身份認(rèn)證服務(wù)之后,就能夠自動使用相關(guān)的應(yīng)用系統(tǒng)用戶來訪問應(yīng)用系統(tǒng)。
    3. 用戶認(rèn)證:為應(yīng)用系統(tǒng)提供用戶身份認(rèn)證,兼顧兩個應(yīng)用方式:
      • 應(yīng)用系統(tǒng)使用統(tǒng)一身份認(rèn)證服務(wù)作為它的用戶系統(tǒng),用戶與應(yīng)用系統(tǒng)進(jìn)行交互,進(jìn)行登錄操作,應(yīng)用 系統(tǒng)將用戶提供的用戶名/密碼等轉(zhuǎn)發(fā)給統(tǒng)一身份認(rèn)證服務(wù)以檢驗其是否通過授權(quán)。
      • 用戶首先登錄統(tǒng)一身份認(rèn)證服務(wù),并獲取權(quán)限令牌,以后可以使用這個權(quán)限令牌訪問其他的應(yīng)用系 統(tǒng),應(yīng)用系統(tǒng)接收該權(quán)限令牌時應(yīng)當(dāng)與統(tǒng)一身份認(rèn)證服務(wù)進(jìn)行交互,以檢驗訪問的合法性。

    用戶注冊

    用戶注冊(包括用戶更新注冊信息)的流程可以使用下圖來表示。其中主要包含了兩個流程:新用戶注冊和用戶更新注冊信息。

    新用戶注冊:

    1. 用戶向統(tǒng)一身份認(rèn)證服務(wù)發(fā)出新用戶注冊請求
    2. 服務(wù)查詢用戶注冊庫,如果該用戶可以注冊(沒有同名ID等違背約束條件的情況發(fā)生),那么將該用戶的信息保存到 用戶注冊庫中。
    3. 當(dāng)保存完畢后,統(tǒng)一身份認(rèn)證服務(wù)響應(yīng)用戶,注冊完成。

    用戶更新注冊信息:

    1. 用戶向統(tǒng)一身份認(rèn)證服務(wù)發(fā)出用戶注冊信息更新請求。
    2. 服務(wù)查詢用戶注冊庫,如果該用戶信息可以更新(有該ID存在,同時提供的密碼也是正確的等等),那么將該用戶的 信息將在用戶注冊庫中更新。
    3. 當(dāng)保存完畢后,統(tǒng)一身份認(rèn)證服務(wù)響應(yīng)用戶,更新完成。

    帳號關(guān)聯(lián)

    帳號關(guān)聯(lián)操作可以使用下圖來表示。圖中僅包含一個登記新的帳號關(guān)聯(lián)的操作,相關(guān)的修改、刪除操作被省略了,有興趣的讀者可 以自行給出

    登記新的帳號關(guān)聯(lián):

    1. 用戶向統(tǒng)一身份認(rèn)證服務(wù)發(fā)出帳號關(guān)聯(lián)注冊請求,用戶提供了應(yīng)用系統(tǒng)的標(biāo)識A,同時提供了可以在該應(yīng)用系統(tǒng)中使用 的用戶信息(可能包含用戶名和密碼等)。
    2. 服務(wù)首先向該應(yīng)用系統(tǒng)A征詢,用戶信息是否合法。如果合法則響應(yīng)服務(wù)。
    3. 如果收到合法響應(yīng),那么服務(wù)就將這個帳號關(guān)聯(lián)注冊信息保存到用戶注冊庫中,以后該用戶登錄統(tǒng)一身份認(rèn)證服務(wù)之 后,就能夠使用相應(yīng)的應(yīng)用系統(tǒng)A。
    4. 當(dāng)注冊庫完成保存操作后,統(tǒng)一身份認(rèn)證服務(wù)響應(yīng)用戶,注冊完成。

    身份認(rèn)證組件模式

    統(tǒng)一身份認(rèn)證服務(wù)的一個基本應(yīng)用模式是以應(yīng)用系統(tǒng)的身份認(rèn)證組件的形式工作,在這個應(yīng)用模式下,主導(dǎo)地位的是應(yīng)用系統(tǒng)。在 這種情況下,應(yīng)用系統(tǒng)自身沒有用戶系統(tǒng),因此本模式下涉及的帳號一定是統(tǒng)一身份認(rèn)證服務(wù)的用戶帳號。

    流程描述如下:(僅描述正常流程)

    1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸應(yīng)用系統(tǒng)A
    2. 應(yīng)用系統(tǒng)A,將用戶名和密碼連同自己的標(biāo)識(應(yīng)用系統(tǒng)A的標(biāo)識)一起轉(zhuǎn)發(fā)給統(tǒng)一認(rèn)證服務(wù),要求統(tǒng)一認(rèn)證服務(wù)完成 登錄操作。
    3. 統(tǒng)一認(rèn)證服務(wù)核查自己的應(yīng)用系統(tǒng)注冊庫(使用UDDI Registry,我將在后面解釋為什么使用UDDI Registry)看看應(yīng)用系統(tǒng)A是否已經(jīng)是統(tǒng)一認(rèn)證服務(wù)的用戶系統(tǒng)。同時在用戶注冊庫中核查由應(yīng)用系統(tǒng)A轉(zhuǎn)發(fā)過來的用戶名和密碼。
    4. 待核查完畢后,統(tǒng)一認(rèn)證服務(wù)響應(yīng)應(yīng)用系統(tǒng)A,登錄完成。
    5. 應(yīng)用系統(tǒng)A創(chuàng)建一個系統(tǒng)會話(Session,系統(tǒng)A自己的機(jī)制),并將應(yīng)用系統(tǒng)A自己的權(quán)限令牌返回給用戶, 以后用戶端可以通過這個權(quán)限令牌持續(xù)訪問應(yīng)用系統(tǒng)A,直至登出系統(tǒng)或是會話超時。

    統(tǒng)一認(rèn)證模式

    統(tǒng)一認(rèn)證模式是以統(tǒng)一身份認(rèn)證服務(wù)為核心的服務(wù)使用模式。用戶登錄統(tǒng)一身份認(rèn)證服務(wù)后,即可使用所有支持統(tǒng)一身份認(rèn)證服務(wù) 的應(yīng)用系統(tǒng)。

    流程描述如下:(僅描述正常流程)

    1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸統(tǒng)一認(rèn)證服務(wù);
    2. 統(tǒng)一認(rèn)證服務(wù)創(chuàng)建了一個會話,同時將與該會話關(guān)聯(lián)的訪問認(rèn)證令牌返回給用戶;
    3. 用戶使用這個訪問認(rèn)證令牌訪問某個支持統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng);
    4. 該應(yīng)用系統(tǒng)將訪問認(rèn)證令牌傳入統(tǒng)一身份認(rèn)證服務(wù),認(rèn)證訪問認(rèn)證令牌的有效性;
    5. 統(tǒng)一身份認(rèn)證服務(wù)確認(rèn)認(rèn)證令牌的有效性;
    6. 應(yīng)用系統(tǒng)接收訪問,并返回訪問結(jié)果,如果需要提高訪問效率的話,應(yīng)用系統(tǒng)可選擇返回其自身的認(rèn)證令牌已使得用戶 之后可以使用這個私有令牌持續(xù)訪問。

    此外,關(guān)于訪問認(rèn)證令牌的失效,有兩個策略,一個是由用戶主動發(fā)起聲明,聲明其擁有的訪問認(rèn)證令牌不再有效,這類似注銷的 操作,另一個是用戶一段時間內(nèi)沒有使用這個認(rèn)證令牌,認(rèn)證令牌自動失效,這類似超時的處理。

    信任代理模式

    在Internet應(yīng)用環(huán)境下,安全性和信任的重要性是顯而易見的,對于商用系統(tǒng)而言,避免非法訪問和入侵是他所需要考慮 的幾個重要問題之一,沒有比商用數(shù)據(jù)丟失或是商用系統(tǒng)被違規(guī)使用更糟糕的了。

    在信任代理模式下,一個組織可以為他所有需要提供安全信任保障的應(yīng)用系統(tǒng)設(shè)置一個統(tǒng)一身份認(rèn)證服務(wù),對這些應(yīng)用系統(tǒng)的訪問 全部由統(tǒng)一身份認(rèn)證服務(wù)代理。

    流程描述如下:(僅描述正常流程)

    1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸統(tǒng)一認(rèn)證服務(wù);
    2. 統(tǒng)一認(rèn)證服務(wù)創(chuàng)建了一個會話,同時將與該會話關(guān)聯(lián)的訪問認(rèn)證令牌返回給用戶;
    3. 用戶使用這個訪問認(rèn)證令牌訪問某個支持統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng),不過用戶并不將請求消息直接交給應(yīng)用系統(tǒng), 而是傳給統(tǒng)一身份認(rèn)證服務(wù),在消息中標(biāo)識了最終的應(yīng)用系統(tǒng)的ID。
    4. 統(tǒng)一認(rèn)證服務(wù)訪問應(yīng)用系統(tǒng)注冊庫(UDDI Registry),獲取了應(yīng)用系統(tǒng)的訪問入口(統(tǒng)一認(rèn)證服務(wù)可以將這個訪問入口緩存在本地,以減少以后與應(yīng)用系統(tǒng)注冊庫的交互次數(shù))。并確認(rèn)這個應(yīng)用系 統(tǒng)的確是支持統(tǒng)一身份認(rèn)證服務(wù)的;
    5. 統(tǒng)一認(rèn)證服務(wù)將請求消息轉(zhuǎn)發(fā)給指定的應(yīng)用系統(tǒng),如果該應(yīng)用系統(tǒng)使用自己的用戶系統(tǒng)的話,那么該消息應(yīng)當(dāng)包含了預(yù) 先定義好的相關(guān)聯(lián)的用戶名和密碼等。
    6. 應(yīng)用系統(tǒng)將請求結(jié)果返回給統(tǒng)一認(rèn)證服務(wù),最后統(tǒng)一認(rèn)證服務(wù)將響應(yīng)消息返回給用戶,完成調(diào)用。

    在該模式下,所有應(yīng)用系統(tǒng)僅接收來自統(tǒng)一認(rèn)證服務(wù)的訪問請求,這樣,解決方案提供商可以將主要的安全方面的投入部署在統(tǒng)一 認(rèn)證服務(wù)那端。


    posted @ 2010-10-22 15:23 俊星 閱讀(1152) | 評論 (0)編輯 收藏

    freetts初探

    FreeTTS是一個語音合成庫,今天進(jìn)行了相關(guān)的試用。
    1、下載完畢之后,構(gòu)建工程,拷貝到LIB中的JAR有:en_us.jar、freetts.jar、jsapi.jar、freetts-jsapi10.jar
    2、jsapi.jar因為采用的授權(quán)不同于freetts,所以需要運行jsapi.exe并同意后來獲取
    3、需要將speech.properties拷貝到user.home或者java.home/lib下
    4、編寫基于JSAPI的HelloWorld程序:
    import java.util.Locale;

    import javax.speech.Central;
    import javax.speech.EngineList;
    import javax.speech.synthesis.Synthesizer;
    import javax.speech.synthesis.SynthesizerModeDesc;
    import javax.speech.synthesis.Voice;

    public class HelloWorld {

        
    public HelloWorld() {
        }

        
    public static void listAllVoices(String modeName) {
            System.out.println(
    "All " + modeName + " Mode JSAPI Synthesizers and Voices:");
            SynthesizerModeDesc required 
    = new SynthesizerModeDesc(null, modeName, Locale.US, nullnull);
            EngineList engineList 
    = Central.availableSynthesizers(required);
            
    for (int i = 0; i < engineList.size(); i++) {
                SynthesizerModeDesc desc 
    = (SynthesizerModeDesc) engineList.get(i);
                System.out.println(
    "    " + desc.getEngineName() + " (mode=" + desc.getModeName() + ", locale="
                        
    + desc.getLocale() + "):");
                Voice voices[] 
    = desc.getVoices();
                
    for (int j = 0; j < voices.length; j++)
                    System.out.println(
    "        " + voices[j].getName());
            }
        }

        
    public static void main(String args[]) {
            
    // 利用 FreeTTS 讀出Good job
            try {
                SynthesizerModeDesc desc 
    = new SynthesizerModeDesc("FreeTTS en_US general synthesizer""general",
                        Locale.US, 
    nullnull);
                Synthesizer synthesizer 
    = Central.createSynthesizer(desc);
                
    if (synthesizer == null) {
                    System.exit(
    1);
                }
                synthesizer.allocate();
                synthesizer.resume();
                desc 
    = (SynthesizerModeDesc) synthesizer.getEngineModeDesc();
                Voice voices[] 
    = desc.getVoices();
                
    for (Voice v : voices) {
                    synthesizer.getSynthesizerProperties().setVoice(v);
                    synthesizer.speakPlainText(
    "good job"null);
                    synthesizer.waitEngineState(
    0x10000L);
                }
                synthesizer.deallocate();
            } 
    catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    5、編寫基于FreeTTS的測試程序:
    import com.sun.speech.freetts.Voice;
    import com.sun.speech.freetts.VoiceManager;

    public class FreeTTSHelloWorld {

        
    public FreeTTSHelloWorld() {
        }

        
    public static void listAllVoices() {
            System.out.println();
            System.out.println(
    "All voices available:");
            VoiceManager voiceManager 
    = VoiceManager.getInstance();
            Voice voices[] 
    = voiceManager.getVoices();
            
    for (int i = 0; i < voices.length; i++)
                System.out.println(
    "    " + voices[i].getName() + " (" + voices[i].getDomain() + " domain)");

        }

        
    public static void main(String args[]) {
            listAllVoices();
            System.out.println();
            VoiceManager voiceManager 
    = VoiceManager.getInstance();
            Voice helloVoice 
    = voiceManager.getVoice("kevin16");
            
    if (helloVoice == null) {
                System.exit(
    1);
            }
            helloVoice.allocate();
            helloVoice.speak(
    "GOOD JOB KINKDING");
            helloVoice.deallocate();
            System.exit(
    0);
        }
    }

    posted @ 2010-10-15 11:28 俊星 閱讀(3429) | 評論 (2)編輯 收藏

    RSS初探

    1、此處有一篇比較好RSS原理介紹文章:http://www.sunnychen.org/article.asp?id=82
    2、編寫相關(guān)的實現(xiàn)代碼:
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.sql.Timestamp;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Locale;
    import java.util.TimeZone;

    /**
     * 簡單HTTP服務(wù)器
     * 
     * 
    @author kinkding
     
    */
    public class MyHTTPServer implements Runnable {
        ServerSocket server;
        
    int port = 80;

        
    public MyHTTPServer() throws IOException {
            server 
    = new ServerSocket(port);
            
    new Thread(this).start();
            System.out.println(
    "HTTP服務(wù)器已經(jīng)啟動");
        }

        
    public void run() {
            
    while (true) {
                
    try {
                    Socket client 
    = server.accept();
                    System.out.println(
    "接收到客戶端:" + client);

                    PrintWriter out 
    = new PrintWriter(client.getOutputStream(), true);
                    out.println(
    "HTTP/1.0 200 OK");
                    out.println(
    "Content-Type:text/html;charset=GBK");
                    out.println();
    // HTTP協(xié)議:空行表示信息結(jié)束
                    this.sendRss(out);
                    out.close();
                    client.close();
                } 
    catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        
    private void sendRss(PrintWriter out) throws IOException {
            
    // 按照RSS 2.0 的規(guī)則進(jìn)行生成
            out.println("<?xml version=\"1.0\" encoding=\"GBK\"?>");
            out.println(
    "<rss version=\"2.0\">");
            out.println(
    "<channel>");
            out.println(
    "<title>科技要聞-CT新聞</title>");
            out.println(
    "<link>http://localhost</link>");
            out.println(
    "<language>zh-cn</language>");
            out.println(
    "<description>科技要聞-CT新聞</description>");
            Date date 
    = new Date();
            SimpleDateFormat formatter 
    = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.US);
            formatter.setTimeZone(TimeZone.getTimeZone(
    "GMT"));
            out.println(
    "<pubDate>" + formatter.format(date) + "</pubDate>");
            
    // 封裝條目
            List<Message> msgs = this.queryMsgs();
            
    for (Message m : msgs) {
                out.println(
    "<item>");
                out.println(
    "<title>" + m.name + "</title>");
                out.println(
    "<pubDate>" + formatter.format(m.time) + "</pubDate>");
                out.println(
    "<description>" + m.desc + "</description>");
                out.println(
    "<link>http://localhost/" + m.id + "</link>");
                out.println(
    "<guid>http://localhost/" + m.id + "</guid>");
                out.println(
    "</item>");
            }
            out.println(
    "</channel>");
            out.println(
    "</rss>");
        }

        
    private List<Message> queryMsgs() {
            List
    <Message> msgs = new ArrayList<Message>();
            
    try {
                Class.forName(
    "org.postgresql.Driver");
                String url 
    = "jdbc:postgresql://localhost:5432/postgres";
                Connection connection 
    = DriverManager.getConnection(url, "postgres""admin");
                Statement stmt 
    = connection.createStatement();
                
    // 查詢前5條記錄進(jìn)行顯示
                ResultSet rs = stmt.executeQuery("SELECT * FROM tbl_messages order by msg_time desc limit 5");

                
    while (rs.next()) {
                    Message msg 
    = new Message();
                    msg.id 
    = rs.getInt("msg_id");
                    msg.name 
    = rs.getString("msg_name");
                    msg.desc 
    = rs.getString("msg_desc");
                    msg.time 
    = rs.getTimestamp("msg_time");
                    msgs.add(msg);
                }
                rs.close();
                stmt.close();
                connection.close();
            } 
    catch (ClassNotFoundException e) {
                e.printStackTrace();
            } 
    catch (SQLException e) {
                e.printStackTrace();
            }
            
    return msgs;
        }

        
    public static void main(String[] args) {
            
    try {
                
    new MyHTTPServer();
            } 
    catch (IOException e) {
                e.printStackTrace();
            }
        }

        
    class Message {
            
    int id;
            String name;
            String desc;
            Timestamp time;
        }

    }

    3、配置postgresql,本機(jī)安裝的是9.0版本,特別需要注意的是,安裝目錄中不能有空格。(直接exe方式安裝的話,會自動生成一個服務(wù));
    同時還需要額外到官網(wǎng)下載相關(guān)的jdbc驅(qū)動,因我本機(jī)JAVA是1.5,所以選擇的是JDBC3的驅(qū)動包:postgresql-9.0-801.jdbc3.zip
    4、編寫相關(guān)的腳本:
    create table tbl_messages(
    msg_id 
    integer PRIMARY KEY,
    msg_name 
    text,
    msg_desc 
    text,
    msg_time  
    timestamp     
    );

    INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (1'騰訊正式起訴360不正當(dāng)競爭','北京時間10月14日晚間消息,新浪科技今天在騰訊官網(wǎng)獲悉,騰訊已于近日正式起訴360,要求奇虎及其關(guān)聯(lián)公司停止侵權(quán)、公開道歉并作出賠償。'current_timestamp);
    INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (2'國奧“搶人“引中超多隊不滿','  本屆國奧隊集訓(xùn)計劃的安排,意味集訓(xùn)的26人將錯過中超聯(lián)賽的最后四輪比賽。受影響最大的大連實德俱樂部只同意楊博宇一人按時去報到,呂鵬、王選宏和趙宏略三人將在聯(lián)賽結(jié)束后才能去參加集訓(xùn)。'current_timestamp);
    INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (3'外交部就日朝官員訪華及南海問題等答問','  2010年10月14日,外交部發(fā)言人馬朝旭主持例行記者會。'current_timestamp);
    INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (4'智利總統(tǒng)稱將追究礦難責(zé)任','據(jù)外電報道,智利圣何塞銅礦救援行動取得了令人感動的成功,也吸引了全世界關(guān)注的目光,不過,在救援行動完成后,圣何塞銅礦的“命運”又將何去何從?智利總統(tǒng)皮涅拉14日表示,該礦將永久性關(guān)閉,同時,將責(zé)成當(dāng)局對相關(guān)責(zé)任人進(jìn)行懲罰。'current_timestamp);
    INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (5'魯能只是所謂領(lǐng)頭羊','  本周六,上海申花就將北上長春,客場挑戰(zhàn)長春亞泰。對于這個幾個賽季都沒有戰(zhàn)勝的對手來說,本場比賽異常關(guān)鍵。賽前,老布對這個對手異常重視,在他看來,長春這個對手絕非一般,而對于本場比賽,老布也明確表示,自己要率領(lǐng)球隊,贏得本場比賽的勝利,打破從未戰(zhàn)勝過長春的尷'current_timestamp);
    INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (6'英第二大警察局通過Twitter公布每起案件','北京時間10月14日晚間消息,據(jù)國外媒體報道,英國第二大警察局大曼徹斯特警察局周四表示,計劃將所處理的每一起案件在24小時內(nèi)發(fā)布到Twitter網(wǎng)站上。'current_timestamp);

    5、運行:
    在瀏覽器中輸入http://localhost/進(jìn)行訪問即可。

    posted @ 2010-10-15 00:23 俊星 閱讀(135) | 評論 (0)編輯 收藏

    Nutz初步試用

    在javaeye上看到Nutz,挺新鮮的一個東西,下面是試用的相關(guān)記錄。
    1、在數(shù)據(jù)庫中創(chuàng)建相關(guān)的表:
    CREATE TABLE tbl_test_person(
    ID NUMBER(10) PRIMARY KEY,
    NAME VARCHAR2(100),
    remark VARCHAR2(1000)
    );

    2、編寫相關(guān)json格式數(shù)據(jù)源配置文件datasource.json:
    {
        dataSource : {
            type : "org.apache.commons.dbcp.BasicDataSource",
            events : {
                depose : 'close'
            },
            fields : {
                driverClassName : 'oracle.jdbc.driver.OracleDriver',
                url : 'jdbc:oracle:thin:@10.10.5.161:1521:oradb10',
                username : 'fwmstest',
                password : 'fwmstest'
            }
        }
    }

    3、編寫相關(guān)的POJO:
    package test;

    import org.nutz.dao.entity.annotation.Column;
    import org.nutz.dao.entity.annotation.Table;

    @Table(
    "tbl_test_person")
    public class Person {
        @Column
        
    private int id;

        @Column
        
    private String name;

        @Column
        
    private String remark;

        
    public int getId() {
            
    return id;
        }


        
    public void setId(int id) {
            
    this.id = id;
        }


        
    public String getName() {
            
    return name;
        }


        
    public void setName(String name) {
            
    this.name = name;
        }


        
    public String getRemark() {
            
    return remark;
        }


        
    public void setRemark(String remark) {
            
    this.remark = remark;
        }


        
    public String toString() {
            
    return "id:" + id + ",name:" + name + ",remark:" + remark;
        }


    }


    4、配置相關(guān)的引用JAR:
    ORACLE的驅(qū)動包classes12.zip
    APACHE的commons-dbcp-1.3.jar包(最開始直接下載的是commons-dbcp-1.4.jar,但工程環(huán)境是1.5,所以運行的時候直接報java.lang.UnsupportedClassVersionError: Bad version number in .class file)以及相關(guān)的commons-pool-1.5.5.jar
    log4j-1.2.16.jar

    5、編寫MAIN程序:
    package test;

    import java.util.List;

    import org.apache.commons.dbcp.BasicDataSource;
    import org.nutz.dao.Dao;
    import org.nutz.dao.impl.NutDao;
    import org.nutz.ioc.Ioc;
    import org.nutz.ioc.impl.NutIoc;
    import org.nutz.ioc.loader.json.JsonLoader;

    public class MainApp {

        
    public static void main(String[] args) {
            Ioc ioc 
    = new NutIoc(new JsonLoader("test/datasource.json"));
            BasicDataSource ds 
    = ioc.get(BasicDataSource.class"dataSource");
            Dao dao 
    = new NutDao(ds);
            
    // 插入10條數(shù)據(jù)
            for (int i = 0; i < 10; i++) {
                Person p 
    = new Person();
                p.setId(i 
    + 1);
                p.setName(
    "good" + i);
                p.setRemark(
    "remark" + i);
                dao.insert(p);
            }
            
    // 查詢所有記錄
            List<Person> list = dao.query(Person.classnullnull);
            
    for (Person p : list) {
                System.out.println(p);
            }
        }

    }


    6、程序運行結(jié)果如下:
    控制臺的輸出:
    2010-10-14 12:59:56 WARN [main] !!You are using default SystemLog! Don't use it in Production environment!!
    id:1,name:good0,remark:remark0
    id:2,name:good1,remark:remark1
    id:3,name:good2,remark:remark2
    id:4,name:good3,remark:remark3
    id:5,name:good4,remark:remark4
    id:6,name:good5,remark:remark5
    id:7,name:good6,remark:remark6
    id:8,name:good7,remark:remark7
    id:9,name:good8,remark:remark8
    id:10,name:good9,remark:remark9

    數(shù)據(jù)庫中,執(zhí)行查詢語句,也對上了號。

    posted @ 2010-10-14 13:10 俊星 閱讀(4108) | 評論 (0)編輯 收藏

    Mysql備份

    1、編寫相關(guān)的備份腳本backup.bat:
    @echo off
    mysqldump -uroot -pXXX test>D:\db_backup\test%date:~0,10%.sql
    其中“%date:~0,10%”表示取出日期后截取前10個字符,因為在目標(biāo)機(jī)器運行%date%得到的是“2010-10-13 星期三”,不符合要求。

    2、執(zhí)行過程中,報如下錯誤:
    mysqldump:   Got   error:   1045:   Access   denied   for   user:   'root@localhost '   (Using   password:   NO)   when   trying   to   connect
    原因是權(quán)限不夠,處理措施如下:

    C:\Documents and Settings\Administrator.SPARK001>mysql -uroot -pXXX
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1450
    Server version: 5.0.67-community MySQL Community Edition (GPL)

    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;
    Query OK, 0 rows affected (0.06 sec)

    mysql> flush privileges;
    Query OK, 0 rows affected (0.00 sec)


    3、運行bat文件后,即生成了“test2010-10-13.sql”類的文件,最后通過設(shè)置WINDOWS系統(tǒng)工具中的任務(wù)計劃功能,即可實現(xiàn)自動備份。

    posted @ 2010-10-13 18:15 俊星 閱讀(154) | 評論 (0)編輯 收藏

    Ftp客戶端簡單編程

    基于APACHE COMMONS中的NET包提供的FTP客戶端類庫實現(xiàn),下面是具體的代碼:

    package test;

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;

    import org.apache.commons.net.PrintCommandListener;
    import org.apache.commons.net.ftp.FTP;
    import org.apache.commons.net.ftp.FTPClient;
    import org.apache.commons.net.ftp.FTPFile;
    import org.apache.commons.net.ftp.FTPReply;

    public class ClientTest {
        
    public static void main(String[] args) {
            ClientTest main 
    = new ClientTest();
            FTPClient ftp 
    = new FTPClient();
            
    // 設(shè)置一個監(jiān)聽
            ftp.addProtocolCommandListener(new PrintCommandListener(new PrintWriter(System.out)));
            
    try {
                ftp.connect(
    "localhost"2121);
                
    int reply = ftp.getReplyCode();
                
    if (!FTPReply.isPositiveCompletion(reply)) {
                    ftp.disconnect();
                    System.out.println(
    "FTP server refused connection");
                }

                
    // 登錄
                ftp.login("admin""admin");
                main.uploadFile(ftp);
                main.listFiles(ftp);
                main.downloadFile(ftp);
                main.deleteFile(ftp);
                main.listFiles(ftp);
                
    // 退出
                ftp.logout();
            }
     catch (IOException e) {
                e.printStackTrace();
                
    if (ftp.isConnected()) {
                    
    try {
                        ftp.disconnect();
                    }
     catch (Exception e2) {
                    }

                }

            }

        }

        
        
    // 列舉文件
        private void listFiles(FTPClient ftp) throws IOException {
            System.out.println(
    "------------START------------");
            
    for (FTPFile f : ftp.listFiles()) {
                System.out.println(f.getName() 
    + " " + f.getSize());
            }

            System.out.println(
    "------------END------------");
        }


        
    // 上傳文件
        private void uploadFile(FTPClient ftp) throws IOException {
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();
            InputStream input 
    = new FileInputStream("res/conf/dushu.jpg");
            ftp.storeFile(
    "dushu.jpg", input);
            input.close();
        }


        
    // 下載文件
        private void downloadFile(FTPClient ftp) throws IOException {
            ftp.setFileType(FTP.BINARY_FILE_TYPE);
            ftp.enterLocalPassiveMode();
            OutputStream output 
    = new FileOutputStream("res/conf/dushu_down.jpg");
            ftp.retrieveFile(
    "dushu.jpg", output);
            output.close();
        }


        
    // 刪除文件
        private void deleteFile(FTPClient ftp) throws IOException {
            ftp.deleteFile(
    "dushu.jpg");
        }

    }


    輸出如下:
    220 Service ready for new user.
    USER admin
    331 User name okay, need password for admin.
    PASS admin
    230 User logged in, proceed.
    TYPE I
    200 Command TYPE okay.
    PASV
    227 Entering Passive Mode (127,0,0,1,13,12)
    STOR dushu.jpg
    150 File status okay; about to open data connection.
    226 Transfer complete.
    ------------START------------
    SYST
    215 UNIX Type: Apache FtpServer
    PASV
    227 Entering Passive Mode (127,0,0,1,13,14)
    LIST
    150 File status okay; about to open data connection.
    226 Closing data connection.
    dushu.jpg 
    83694
    ------------END------------
    TYPE I
    200 Command TYPE okay.
    PASV
    227 Entering Passive Mode (127,0,0,1,13,16)
    RETR dushu.jpg
    150 File status okay; about to open data connection.
    226 Transfer complete.
    DELE dushu.jpg
    250 Requested file action okay, deleted /dushu.jpg.
    ------------START------------
    PASV
    227 Entering Passive Mode (127,0,0,1,13,18)
    LIST
    150 File status okay; about to open data connection.
    226 Closing data connection.
    ------------END------------
    QUIT
    221 Goodbye.

    最后,提供一張自己拍的讀書圖:

    posted @ 2010-10-12 15:37 俊星 閱讀(1025) | 評論 (0)編輯 收藏

    APACHE FTPserver 初探

    目前搭建起來了一個可以運行的源代碼環(huán)境,已經(jīng)打包上傳到:/Files/kinkding/ftpserver.rar

    posted @ 2010-10-11 18:44 俊星 閱讀(204) | 評論 (0)編輯 收藏

    Window下FTP命令使用

    直接在命令行中,使用FTP命令進(jìn)行FTP的相關(guān)操作:


    C:\Documents and Settings\dingjunxing>ftp
    ftp> open localhost 2121
    Connected to DINGJX.
    220 Service ready for new user.
    User (DINGJX:(none)): admin
    331 User name okay, need password for admin.
    Password:
    230 User logged in, proceed.
    ftp> dir
    200 Command PORT okay.
    150 File status okay; about to open data connection.
    -rw-------   1 user group        67646 Oct 11 17:50 03_photos.ico
    226 Closing data connection.
    ftp: 收到 67 字節(jié),用時 0.03Seconds 2.16Kbytes/sec.
    ftp> ls
    200 Command PORT okay.
    150 File status okay; about to open data connection.
    03_photos.ico
    226 Closing data connection.
    ftp: 收到 15 字節(jié),用時 0.00Seconds 15000.00Kbytes/sec.
    ftp> get 03_photos.ico
    200 Command PORT okay.
    150 File status okay; about to open data connection.
    226 Transfer complete.
    ftp: 收到 67680 字節(jié),用時 0.02Seconds 4230.00Kbytes/sec.
    ftp> delete 03_photos.ico
    250 Requested file action okay, deleted /03_photos.ico.
    ftp> put 03_photos.ico
    200 Command PORT okay.
    150 File status okay; about to open data connection.
    226 Transfer complete.
    ftp: 發(fā)送 67680 字節(jié),用時 0.02Seconds 4230.00Kbytes/sec.
    ftp> put F:\eclipse\workspace\ftpserver\res\ftpserver.jks
    200 Command PORT okay.
    150 File status okay; about to open data connection.
    226 Transfer complete.
    ftp: 發(fā)送 1242 字節(jié),用時 0.00Seconds 1242000.00Kbytes/sec.
    ftp> mkdir test
    257 "/test" created.
    ftp> bye
    221 Goodbye.

    posted @ 2010-10-11 18:29 俊星 閱讀(3518) | 評論 (0)編輯 收藏

    ftp的port和pasv模式(轉(zhuǎn))

    該文為轉(zhuǎn)載,原文地址:http://hi.baidu.com/xianyang1981/blog/item/f17d6f6d8650c0f842169427.html

    一、ftp的port和pasv模式的工作方式
           FTP使用2個TCP端口,首先是建立一個命令端口(控制端口),然后再產(chǎn)生一個數(shù)據(jù)端口。國內(nèi)很多教科書都講ftp使用21命令端口和20數(shù)據(jù)端口,這個應(yīng)該是教書更新太慢的原因吧。實際上FTP分為主動模式和被動模式兩種,ftp工作在主動模式使用tcp 21和20兩個端口,而工作在被動模式會工作在大于1024隨機(jī)端口。FTP最權(quán)威的參考見RFC 959,有興趣的朋友可以仔細(xì)閱讀
    ftp://nic.merit.edu/documents/rfc/rfc0959.txt的文檔了解FTP詳細(xì)工作模式和命令。目前主流的FTP Server服務(wù)器模式都是同時支持port和pasv兩種方式,但是為了方便管理安全管理防火墻和設(shè)置ACL了解FTP Server的port和pasv模式是很有必要的。

    1.1 ftp port模式(主動模式)
           主動方式的FTP是這樣的:客戶端從一個任意的非特權(quán)端口N(N>1024)連接到FTP服務(wù)器的命令端口(即tcp 21端口)。緊接著客戶端開始監(jiān)聽端口N+1,并發(fā)送FTP命令“port N+1”到FTP服務(wù)器。最后服務(wù)器會從它自己的數(shù)據(jù)端口(20)連接到客戶端指定的數(shù)據(jù)端口(N+1),這樣客戶端就可以和ftp服務(wù)器建立數(shù)據(jù)傳輸通道了。ftp port模式工作流程如下圖所示:

    針對FTP服務(wù)器前面的防火墻來說,必須允許以下通訊才能支持主動方式FTP:
    1、客戶端口>1024端口到FTP服務(wù)器的21端口 (入:客戶端初始化的連接 S<-C)
    2、FTP服務(wù)器的21端口到客戶端>1024的端口(出:服務(wù)器響應(yīng)客戶端的控制端口 S->C)
    3、FTP服務(wù)器的20端口到客戶端>1024的端口(出:服務(wù)器端初始化數(shù)據(jù)連接到客戶端的數(shù)據(jù)端口 S->C)
    4、客戶端>1024端口到FTP服務(wù)器的20端口(入:客戶端發(fā)送ACK響應(yīng)到服務(wù)器的數(shù)據(jù)端口 S<-C)

     

    1.2 ftp pasv模式(被動模式)
           在被動方式FTP中,命令連接和數(shù)據(jù)連接都由客戶端。當(dāng)開啟一個FTP連接時,客戶端打開兩個任意的非特權(quán)本地端口(N > 1024和N+1)。第一個端口連接服務(wù)器的21端口,但與主動方式的FTP不同,客戶端不會提交PORT命令并允許服務(wù)器來回連它的數(shù)據(jù)端口,而是提交 PASV命令。這樣做的結(jié)果是服務(wù)器會開啟一個任意的非特權(quán)端口(P > 1024),并發(fā)送PORT P命令給客戶端。然后客戶端發(fā)起從本地端口N+1到服務(wù)器的端口P的連接用來傳送數(shù)據(jù)。ftp pasv模式工作流程如下圖所示:

    對于服務(wù)器端的防火墻來說,必須允許下面的通訊才能支持被動方式的FTP:
    1、客戶端>1024端口到服務(wù)器的21端口 (入:客戶端初始化的連接 S<-C)
    2、服務(wù)器的21端口到客戶端>1024的端口 (出:服務(wù)器響應(yīng)到客戶端的控制端口的連接 S->C)
    3、客戶端>1024端口到服務(wù)器的大于1024端口 (入:客戶端初始化數(shù)據(jù)連接到服務(wù)器指定的任意端口 S<-C)
    4、服務(wù)器的大于1024端口到遠(yuǎn)程的大于1024的端口(出:服務(wù)器發(fā)送ACK響應(yīng)和數(shù)據(jù)到客戶端的數(shù)據(jù)端口 S->C)

    posted @ 2010-10-11 17:55 俊星 閱讀(8030) | 評論 (0)編輯 收藏

    在ubuntu上手工安裝JDK

    ubuntu上安裝JDK的方法有多種,我選擇的是手工安裝的方式,下面是安裝過程,以備忘:
    1:下載安裝文件,如jdk-6u14-linux-i586.bin
    2:開始安裝,使用到的命令有:
    // 切換到管理員
    sudo su

    // 刪除文件
    rm jdk-6u14-linux-i586.bin 

    // 級聯(lián)刪除文件夾
    rm -rf jdk1
    .6.0_14/

    // 拷貝文件
    cp /home/kinkding/download/jdk-6u14-linux-i586.bin ./

    // 拷貝文件夾
    cp -rf /home/kinkding/dev/jdk1
    .6.0_14 /usr/java/

    // 授予文件執(zhí)行權(quán)限
    chmod +x jdk-6u14-linux-i586.bin 

    // 執(zhí)行文件
    ./jdk-6u14-linux-i586.bin 

    // 編輯profile文件按
    gedit /etc/profile

    // 在profile中添加的語句,設(shè)置環(huán)境變量(一般放置在文件尾部,umask 022之前)
    export JAVA_HOME
    =/usr/java/jdk1.6.0_14
    export CLASSPATH
    =$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
    export PATH
    =$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

    注意:修改/etc/profile之后,需要注銷重登陸才生效。

    posted @ 2009-06-05 12:54 俊星 閱讀(456) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲熟女一区二区三区| 亚洲制服丝袜精品久久| 亚洲AV无码男人的天堂| 黄网站色视频免费在线观看的a站最新| 国产桃色在线成免费视频| 国产亚洲精品精品国产亚洲综合| 一本色道久久综合亚洲精品蜜桃冫 | 精品无码国产污污污免费网站国产 | 亚洲国产精品尤物YW在线观看| 亚洲成aⅴ人片在线影院八| aa在线免费观看| 男人的天堂亚洲一区二区三区 | 7723日本高清完整版免费| 亚洲自偷自偷图片| 麻豆69堂免费视频| 成人毛片免费播放| 亚洲熟妇无码爱v在线观看| 伊人久久大香线蕉免费视频| 国产在线ts人妖免费视频| 亚洲国产模特在线播放| 99在线免费观看视频| 亚洲中文字幕无码一区| 黄色免费在线网址| 美女被免费视频网站a国产| 亚洲人色大成年网站在线观看| 免费福利在线视频| 亚洲精品亚洲人成在线观看| 免费无码AV一区二区| 日韩中文无码有码免费视频 | 国产又粗又长又硬免费视频| 亚洲制服丝袜第一页| 永久在线免费观看| 在线免费观看亚洲| 久久久久国产免费| 亚洲爆乳无码一区二区三区| 毛片基地看看成人免费| 4338×亚洲全国最大色成网站| 特黄aa级毛片免费视频播放| 国产免费直播在线观看视频| 久久精品国产亚洲av天美18 | 一级特黄录像免费播放肥|