俊星的BLOG

          2010年10月15日 #

          實(shí)現(xiàn)變更統(tǒng)計(jì)

          1、在本地?cái)?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)計(jì)視圖:
          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 俊星 閱讀(296) | 評(píng)論 (0)編輯 收藏

          切換IE8中碰到的問題

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

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

          posted @ 2010-11-10 10:04 俊星 閱讀(345) | 評(píng)論 (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\
          (注意需要選中搜索子目錄項(xiàng))

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

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

          6、發(fā)布啟動(dòng)weblogic的時(shí)候,報(bào)“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 俊星 閱讀(463) | 評(píng)論 (0)編輯 收藏

          ActiveMQ初探

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

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

          3、可通過訪問http://localhost:8161/admin/來查看啟動(dòng)情況,有可通過netstat -an|find "61616" 來查看端口,因?yàn)橥ㄟ^查看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的控制臺(tái)中創(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ā)送類,則會(huì)接受到多條“你好 ActiveMQ!”消息)

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

          CAS初步配置

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

          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)行驗(yà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)行驗(yàn)證。
          另:需要特別說明,cas應(yīng)用中默認(rèn)配置的是SimpleTestUsernamePasswordAuthenticationHandler,該處理類只要保持用戶名、密碼一直即可通過驗(yàn)證。

          4、配置CAS客戶端:
          在webapps\examples\WEB-INF中,對(duì)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>
          同時(shí),將cas-client-2.0.11.zip中的casclient.jar,拷貝到webapps\examples\WEB-INF\lib中,重啟TOMCAT即可進(jìn)行驗(yàn)證。

          5、驗(yàn)證CAS:
          a、在瀏覽器中訪問“http://localhost:8080/examples/servlets/servlet/HelloWorldExample”
          b、基于前面配置的過濾器,瀏覽器會(huì)定向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、瀏覽器提示安全警告,點(diǎn)擊確定后即轉(zhuǎn)入到“http://localhost:8080/examples/servlets/servlet/HelloWorldExample?ticket=ST-1-xWK9nwArDLbjCwYiXOqu-cas”,同時(shí)頁面打出“Hello World”,配置成功。

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

          HTTP Client及HTTPS初探

          HTTP Client是一個(gè)客戶端HTTP協(xié)議的類庫
          1、首先是下載APACHE HTTP CLIENT相關(guān)的JAR,目前我引入到工程中的相關(guān)文件時(shí):
          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、下載并運(yùn)行TOMCAT,我下載的是TOMCAT6(對(duì)應(yīng)的是JDK5),主要注意的是需要配置CATALINA_HOME這個(gè)環(huán)境變量。

          3、制作服務(wù)器端證書,下面是我一個(gè)示例:
          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,下面提供一個(gè)利用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
          序號(hào): 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
          信任這個(gè)認(rèn)證? [否]:  y
          認(rèn)證已添加至keystore中

          6、TOMCAT中相關(guān)設(shè)置,主要是修改CATALINA_HOME下的conf/server.xml,在其中添加如下一個(gè)連接器:
          <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、運(yùn)行相關(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();
              }

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

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

          CAS認(rèn)證初探

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

          1、列舉出來其需要的幾項(xiàng)功能:

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

          1. 用戶注冊(cè):用戶在統(tǒng)一身份認(rèn)證服務(wù)中注冊(cè)帳號(hào),以后這個(gè)帳號(hào)可以在所有使用統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng)中使用。
          2. 帳號(hào)關(guān)聯(lián):如果用戶之前已經(jīng)在相關(guān)的應(yīng)用系統(tǒng)中擁有帳號(hào),同時(shí)也已經(jīng)設(shè)置了相應(yīng)的權(quán)限,那么用戶能夠?qū)⑦@些應(yīng)用 系統(tǒng)的帳號(hào)與統(tǒng)一身份認(rèn)證服務(wù)的帳號(hào)進(jìn)行關(guān)聯(lián),使得用戶登錄統(tǒng)一身份認(rèn)證服務(wù)之后,就能夠自動(dòng)使用相關(guān)的應(yīng)用系統(tǒng)用戶來訪問應(yīng)用系統(tǒng)。
          3. 用戶認(rèn)證:為應(yīng)用系統(tǒng)提供用戶身份認(rèn)證,兼顧兩個(gè)應(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ù)以檢驗(yàn)其是否通過授權(quán)。
            • 用戶首先登錄統(tǒng)一身份認(rèn)證服務(wù),并獲取權(quán)限令牌,以后可以使用這個(gè)權(quán)限令牌訪問其他的應(yīng)用系 統(tǒng),應(yīng)用系統(tǒng)接收該權(quán)限令牌時(shí)應(yīng)當(dāng)與統(tǒng)一身份認(rèn)證服務(wù)進(jìn)行交互,以檢驗(yàn)訪問的合法性。

          用戶注冊(cè)

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

          新用戶注冊(cè):

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

          用戶更新注冊(cè)信息:

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

          帳號(hào)關(guān)聯(lián)

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

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

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

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

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

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

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

          統(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ù)注冊(cè)的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸統(tǒng)一認(rèn)證服務(wù);
          2. 統(tǒng)一認(rèn)證服務(wù)創(chuàng)建了一個(gè)會(huì)話,同時(shí)將與該會(huì)話關(guān)聯(lián)的訪問認(rèn)證令牌返回給用戶;
          3. 用戶使用這個(gè)訪問認(rèn)證令牌訪問某個(gè)支持統(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)證令牌已使得用戶 之后可以使用這個(gè)私有令牌持續(xù)訪問。

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

          信任代理模式

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

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

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

          1. 用戶使用在統(tǒng)一認(rèn)證服務(wù)注冊(cè)的用戶名和密碼(也可能是其他的授權(quán)信息,比如數(shù)字簽名等)登陸統(tǒng)一認(rèn)證服務(wù);
          2. 統(tǒng)一認(rèn)證服務(wù)創(chuàng)建了一個(gè)會(huì)話,同時(shí)將與該會(huì)話關(guān)聯(lián)的訪問認(rèn)證令牌返回給用戶;
          3. 用戶使用這個(gè)訪問認(rèn)證令牌訪問某個(gè)支持統(tǒng)一身份認(rèn)證服務(wù)的應(yīng)用系統(tǒng),不過用戶并不將請(qǐng)求消息直接交給應(yīng)用系統(tǒng), 而是傳給統(tǒng)一身份認(rèn)證服務(wù),在消息中標(biāo)識(shí)了最終的應(yīng)用系統(tǒng)的ID。
          4. 統(tǒng)一認(rèn)證服務(wù)訪問應(yīng)用系統(tǒng)注冊(cè)庫(UDDI Registry),獲取了應(yīng)用系統(tǒng)的訪問入口(統(tǒng)一認(rèn)證服務(wù)可以將這個(gè)訪問入口緩存在本地,以減少以后與應(yīng)用系統(tǒng)注冊(cè)庫的交互次數(shù))。并確認(rèn)這個(gè)應(yīng)用系 統(tǒng)的確是支持統(tǒng)一身份認(rèn)證服務(wù)的;
          5. 統(tǒng)一認(rèn)證服務(wù)將請(qǐng)求消息轉(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)將請(qǐ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ù)的訪問請(qǐng)求,這樣,解決方案提供商可以將主要的安全方面的投入部署在統(tǒng)一 認(rèn)證服務(wù)那端。


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

          freetts初探

          FreeTTS是一個(gè)語音合成庫,今天進(jìn)行了相關(guān)的試用。
          1、下載完畢之后,構(gòu)建工程,拷貝到LIB中的JAR有:en_us.jar、freetts.jar、jsapi.jar、freetts-jsapi10.jar
          2、jsapi.jar因?yàn)椴捎玫氖跈?quán)不同于freetts,所以需要運(yùn)行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的測(cè)試程序:
          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 俊星 閱讀(3430) | 評(píng)論 (2)編輯 收藏

          RSS初探

          1、此處有一篇比較好RSS原理介紹文章:http://www.sunnychen.org/article.asp?id=82
          2、編寫相關(guān)的實(shí)現(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)啟動(dò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方式安裝的話,會(huì)自動(dòng)生成一個(gè)服務(wù));
          同時(shí)還需要額外到官網(wǎng)下載相關(guān)的jdbc驅(qū)動(dòng),因我本機(jī)JAVA是1.5,所以選擇的是JDBC3的驅(qū)動(dòng)包: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)競爭','北京時(shí)間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'國奧“搶人“引中超多隊(duì)不滿','  本屆國奧隊(duì)集訓(xùn)計(jì)劃的安排,意味集訓(xùn)的26人將錯(cuò)過中超聯(lián)賽的最后四輪比賽。受影響最大的大連實(shí)德俱樂部只同意楊博宇一人按時(shí)去報(bào)到,呂鵬、王選宏和趙宏略三人將在聯(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ā)言人馬朝旭主持例行記者會(huì)。'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (4'智利總統(tǒng)稱將追究礦難責(zé)任','據(jù)外電報(bào)道,智利圣何塞銅礦救援行動(dòng)取得了令人感動(dòng)的成功,也吸引了全世界關(guān)注的目光,不過,在救援行動(dòng)完成后,圣何塞銅礦的“命運(yùn)”又將何去何從?智利總統(tǒng)皮涅拉14日表示,該礦將永久性關(guān)閉,同時(shí),將責(zé)成當(dāng)局對(duì)相關(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)長春亞泰。對(duì)于這個(gè)幾個(gè)賽季都沒有戰(zhàn)勝的對(duì)手來說,本場比賽異常關(guān)鍵。賽前,老布對(duì)這個(gè)對(duì)手異常重視,在他看來,長春這個(gè)對(duì)手絕非一般,而對(duì)于本場比賽,老布也明確表示,自己要率領(lǐng)球隊(duì),贏得本場比賽的勝利,打破從未戰(zhàn)勝過長春的尷'current_timestamp);
          INSERT INTO tbl_messages (msg_id,msg_name, msg_desc, msg_time) VALUES (6'英第二大警察局通過Twitter公布每起案件','北京時(shí)間10月14日晚間消息,據(jù)國外媒體報(bào)道,英國第二大警察局大曼徹斯特警察局周四表示,計(jì)劃將所處理的每一起案件在24小時(shí)內(nèi)發(fā)布到Twitter網(wǎng)站上。'current_timestamp);

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

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

          主站蜘蛛池模板: 林芝县| 台东县| 宁城县| 寿宁县| 阿巴嘎旗| 巴青县| 牙克石市| 辉县市| 彭州市| 长沙市| 龙游县| 扎兰屯市| 庄河市| 托克托县| 鸡东县| 广宗县| 贞丰县| 隆回县| 高阳县| 沂水县| 山阳县| 福鼎市| 岳西县| 清河县| 大连市| 徐水县| 泰和县| 包头市| 江安县| 隆昌县| 黄大仙区| 黎川县| 南安市| 剑阁县| 县级市| 陵水| 洛川县| 康保县| 米易县| 莱芜市| 曲沃县|