BlogJava 聯系 聚合 管理  

          Blog Stats

          隨筆分類

          隨筆檔案


          chinadave

          2009年11月16日 #

          Tomcat6.0 SSL的配置

          J2EE   2009-07-27 15:30   閱讀217   評論0  
          字號:    

          1. 參考:

          Tomcat 6.0 自帶的文檔docs/ssl-howto.html,詳細介紹了配置過程。

          2. 目的:

                 以下詳細描述配置過程,僅作為備忘錄。

          3. 備忘錄:

          Step1,安裝tomcat 6.0.18,此為當前最新版本,需JDK5.0或以上。

          l         JDK安裝后,可以在命令行下使用如下命令檢測是否成功。

          C:\Documents and Settings\new>java -version

          java version "1.6.0_10"

          Java(TM) SE Runtime Environment (build 1.6.0_10-b33)

          Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)

          看到以上藍色信息,則表示JDK安裝配置成功。

          l         Tomcat的運行需要配置JDK_HOMEJRE_HOME環境變量,JRE_HOME默認等于JDK_HOME的值。

          Step2,創建服務器端certificate keystore和自簽名certificate。

                 在命令行下使用如下命令:

          C:\Documents and Settings\new>keytool -genkey -alias mykey -keyalg RSA -keystore server.keystore

          輸入keystore密碼:123456

          再次輸入新密碼:123456

          您的名字與姓氏是什么?

            [Unknown]  dinstone

          您的組織單位名稱是什么?

            [Unknown]  advance software ltd.

          您的組織名稱是什么?

            [Unknown]  china

          您所在的城市或區域名稱是什么?

            [Unknown]  beijing

          您所在的州或省份名稱是什么?

            [Unknown]  beijing

          該單位的兩字母國家代碼是什么

            [Unknown]  cn

          CN=dinstone, OU=advance software ltd., O=china, L=beijing, ST=beijing, C=cn 正確嗎?

            []  y

           

          輸入<mykey>的主密碼

                  (如果和 keystore 密碼相同,按回車):

          C:\Documents and Settings\new下可以找到一個文件:server.keystore,其中就包含了自簽名的證書。

          注意:

                 這里要求certificate keystore certificate的密碼一致,此為Tomcat的約束。

          Step3,在%TOMCAT_HOME%目錄下新建目錄keystore,并拷貝server.keystore到其目錄下。

          Step4,修改%TOMCAT_HOME%/conf/server.xml文件。添加httpsConnector。

          <Connector

                     port="8443" minSpareThreads="5" maxSpareThreads="75"

                     enableLookups="true" disableUploadTimeout="true"

                     acceptCount="100"  maxThreads="200"

                     scheme="https" secure="true" SSLEnabled="true"

                     keystoreFile="keystore/server.keystore" keystorePass="123456"

                     clientAuth="false" sslProtocol="TLS"/>

          注意:

                 keystoreFile指向文件%TOMCAT_HOME%/keystore/server.keystore文件。

                 keystorePass就是剛才生成certificate keystore的密碼。

          Step5,測試Https。訪問https://localhost:8443/,提示有不安全的證書,接受證書,看到可親的tom貓。

          4. 延伸

          某些情況下,某些特定資源需要走https協議,如登錄請求。這時,我們可以在web.xml中配置約束。

          <security-constraint>

                 <web-resource-collection>

                     <web-resource-name>SSL Resource</web-resource-name>

                     <url-pattern>/login.jsp</url-pattern>

                 </web-resource-collection>

                 <user-data-constraint>

                         <transport-guarantee>
                                 CONFIDENTIAL

          </transport-guarantee>

                 </user-data-constraint>

          </security-constraint>

          這樣當使用如下請求訪問登錄頁面時,則服務器將該請求建立在https連接上。

          http://localhost:8080/CCB/login.jsp

          posted @ 2009-12-14 17:30 whoami 閱讀(566) | 評論 (0)編輯 收藏

          最近要做一個登錄時數字證書驗證的功能,在用戶登錄時除了效驗用戶名密碼,還需驗證其數字證書。

          相關資源:IBM developerWroks中國中的tomcat4中使用SSL,javaeye中的Acegi X.509雙向認證

          tomcat4中使用SSL中的異同:jdk1.4中已經包含JSSE。

          AcegiX.509雙向認證中的異同:tomcat6配置文件多了SSLEnabled="true"屬性。

          1.生成CA證書。目前不使用第三方權威機構的CA來認證,自己充當CA的角色。

          1.創建私鑰 :C:\OpenSSL\apps>openssl genrsa -out root/root-key.pem 1024
          2.創建證書請求 :C:\OpenSSL\apps>openssl req -new -out root/root-req.csr -key root/root-key.pem
          3.自簽署證書 :C:\OpenSSL\apps>openssl x509 -req -in root/root-req.csr -out root/root-cert.pem -signkey
          root/root-key.pem -days 3650
          4.將證書導出成瀏覽器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in root/root-cert.pem -inkey
          root/root-key.pem -out root/root.p12

          2.生成server證書。

          1.創建私鑰 :C:\OpenSSL\apps>openssl genrsa -out server/server-key.pem 1024
          2.創建證書請求 :C:\OpenSSL\apps>openssl req -new -out server/server-req.csr -key server/server-key.pem
          3.自簽署證書 :C:\OpenSSL\apps>openssl x509 -req -in server/server-req.csr -out server/server-cert.pem -signkey
          server/server-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
          4.將證書導出成瀏覽器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in server/server-cert.pem -inkey
          server/server-key.pem -out server/server.p12

          3.生成client證書。

          1.創建私鑰 :C:\OpenSSL\apps>openssl genrsa -out client/client-key.pem 1024
          2.創建證書請求 :C:\OpenSSL\apps>openssl req -new -out client/client-req.csr -key client/client-key.pem
          3.自簽署證書 :C:\OpenSSL\apps>openssl x509 -req -in client/client-req.csr -out client/client-cert.pem -signkey
          client/client-key.pem -CA root/root-cert.pem -CAkey root/root-key.pem -CAcreateserial -days 3650
          4.將證書導出成瀏覽器支持的.p12格式 :C:\OpenSSL\apps>openssl pkcs12 -export -clcerts -in client/client-cert.pem -inkey
          client/client-key.pem -out client/client.p12

          4.根據root證書生成jks文件

          C:\OpenSSL\apps\root>keytool -import -v -trustcacerts -storepass password -alias root -file root-cert.pem
          -keystore root.jks

          5.配置tomcat ssl,修改conf/server.xml。tomcat6中多了SSLEnabled="true"屬性。
          keystorefile, truststorefile設置為你正確的相關路徑
          xml 代碼
           
          1. <connector secure="true" scheme="https" protocol="HTTP/1.1" port="8443"      
          2. sslenabled="true" maxhttpheadersize="8192" maxthreads="150"      
          3. minsparethreads="25" maxsparethreads="75" enablelookups="false"      
          4. disableuploadtimeout="true" acceptcount="100" sslprotocol="TLS"      
          5. clientauth="true" keystorefile="d:/path/bin/x509/server.p12"      
          6. keystoretype="PKCS12" keystorepass="123456" truststorefile="d:/path/bin/x509/root.jks"    
          7. truststoretype="JKS" truststorepass="123456"/>    

          6.將root.p12,client.p12分別導入到IE中去(打開IE->;Internet選項->內容->證書)。
          root.p12導入至受信任的根證書頒發機構,client.p12導入至個人
          7.訪問你的應用http://ip:8443,如果配置正確的話會出現請求你數字證書的對話框。
          8.在jsp中取得符合x.509格式的證書
          1. <%      
          2.         //獲得certificate chain     
          3.         X509Certificate[] ca=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");     
          4.       if(ca==null)     
          5.       {     
          6.         out.println("No cert info!");     
          7.       } else {     
          8.         String  serial=ca[0].getSerialNumber().toString();     
          9.         String DN=ca[0].getSubjectDN().toString();       
          10.       }     
          11.       %> 


          posted @ 2009-12-14 11:51 whoami 閱讀(145) | 評論 (0)編輯 收藏

          Java IDL技術在Java平臺上添加了CORBA(Common Object Request Broker Architecture)功能,提供了基于標準的互操作能力和連接性。Java IDL技術使得分布式的Java Web應用能夠通過使用工業標準的IDL和IIOP(Internet Inter-ORB Protocol)來透明地調用遠程網絡服務的操作。運行時組件(Runtime Components)包括了一個用于分布式計算且使用IIOP通信的Java ORB.

          可移植對象適配器(Portable Object Adapter,POA)
          CORBA對象的負責分隔服務器端遠程調用句柄 (handler)到遠程對象和它的服務者(servant)。對象由遠程調用所暴露,而服務者包含實際處理這些請求的方法。每個對象都可以選擇服務者為 靜態的(一次)或動態的(每個遠程調用),在這兩種情況下,都允許調用轉移到另一臺服務器。
          在服務器端,POA形成了類似樹狀的結構,每個POA都負責一到多個服務的對象。樹的分支可以是獨立活動的、或鈍化的,服務者調用有不同的代碼和不同的請求處理策略。

          API規范
              * org.omg.CORBA 包 - 提供了OMG CORBA APIs到Java編程語言的映射
              * org.omg.CosNaming 包 - 為Java IDL提供命名服務
              * org.omg.PortableServer 包 - 為建立服務器端的可移植的、跨越多ORB的應用程序提供類和接口
              * org.omg.PortableInterceptor 包 - 提供了注冊ORB鉤子的機制,此鉤子通過ORB服務能截取正常的ORB執行流
              * org.omg.DynamicAny 包 - 提供了使得任何值都能被動態解釋(或遍歷)和通過DynAny對象構造出來的類和接口
              * org.omg.CORBA.ORB - 為CORBA ORB功能的API

          分布式對象之間的關系有兩方面:客戶端和服務器。
          服務器提供遠程接口,客戶端調用遠程接口。
          在客戶端,應用程序包括遠程對象的引用。該對象引用有stub方法,它是獨立的遠程方法。stub方法實際連接到ORB,因此調用它實際上轉發調用到服務器。
          在服務器端,ORB使用skeleton代碼翻譯遠程調用為本地對象的方法調用。Skeleton把調用轉換成指定實現的格式,并在方法中調用。當方法返回時,Skeleton代碼轉換方法調用的結果或錯誤,經ORB送回客戶端。

          Java IDL開發過程
          1)定義遠程接口
          使用IDL語言為遠程對象定義接口。
          【Billing.idl源代碼】如下:

          1. // 聲明CORBA IDL模塊  
          2. module BillingApp{  
          3.     // 聲明接口  
          4.     interface Billing{  
          5.         string successBilling();  
          6.         oneway void shutdown();  
          7.     };  
          8. };  

          2)編譯遠程接口
          使用idlj編譯器生成Java語言的stub和skeleton源文件。
          idlj編譯器缺省只生成客戶端的binding代碼。如果同時需要客戶端的bindings和服務器端的skeletons,必須加上-fall選項。
          使用POA(Portable Object Adaptor)的優點:
          · 允許編程者構建對象在不同ORB產品之間的可移植實現
          · 支持帶持久化標識的對象
          · 對對象的透明活動提供支持
          · 允許單個servant支持多種對象同時標識
          注意:確定jdk/bin目錄下有:idlj、java、javac、orbd
          命令:
           idlj -fall Billing.idl
          在當前目錄下生成BillingApp目錄,包含如下六個文件:
          · Billing.java    ————> 此接口包含IDL接口的Java版本。它繼承自org.omg.CORBA.Object,提供標準的CORBA對象功能。
          · BillingHelper.java    ————> 此類提供輔助功能,Helper類負責讀寫數據類型到CORBA流,以及插入和提取數據類型。
          · BillingHolder.java    ————> This final class holds a public instance member of type Billing.
          · BillingOperations.java    ————> 此接口包含successBilling()和shutdown()方法。
          · BillingPOA.java    ————> 此抽象類是基于流的服務器Skeleton,為服務器提供基本的CORBA功能。它繼承org.omg.PortableServer.Servant, 實現了InvokeHandler接口和BillingOperations接口。服務器類BillingServant繼承BillingPOA。
          · _BillingStub.java    ————> 此類是客戶端stub,為客戶端提供CORBA功能。它繼承org.omg.CORBA.Object,提供標準CORBA對象功能。還擴展了 BillingOperations接口和org.omg.CORBA.portable.IDLEntity接口。

          3)實現服務器端
          一旦使用idlj編譯器后,就可以使用它產生的Skeleton裝配服務器應用程序了。另外要實現遠程接口方法,服務器代碼應包含啟動ORB和等待遠程客戶端調用的機制。
          服務器端由兩個類組成,一個是servant,另一個是Server。
          servant是BillingImpl類,是Billing IDL接口的實現,每個Billing實例均由BillingImpl實例實現。servant是BillingPOA的子類。
          servant包含了IDL定義的所有方法,與通常的Java方法類似。
          server類含服務器的main()方法,它:
          · 創建和初始化ORB實例
          · 獲得根POA的引用并激活POAManager
          · 創建一個Servant實例(CORBA的Billing對象的實現)并通知ORB
          · 獲得根命名上下文
          · 在命名上下文用“Billing”名注冊新對象
          · 等待客戶端調用此新對象

          【BillingImpl.java源碼】:

          1. import org.omg.CORBA.ORB;  
          2. import BillingApp.*;  
          3. class BillingImpl extends BillingPOA{  
          4.  private ORB orb;  
          5.  public void setORB(ORB orb_val){  
          6.   this.orb = orb_val;  
          7.  }  
          8.  /** 
          9.   * 實現successBilling()方法 
          10.   */  
          11.  public String successBilling() {  
          12.   return "\nBilling success!!\n";  
          13.  }  
          14.  /** 
          15.   * 實現shutdown()方法 
          16.   */  
          17.  public void shutdown(){  
          18.   orb.shutdown(false);  
          19.  }  
          20. }  

          【BillingServer.java源碼】:

          1. import org.omg.CORBA.ORB;  
          2. import org.omg.CosNaming.NameComponent;  
          3. import org.omg.CosNaming.NamingContextExt;  
          4. import org.omg.CosNaming.NamingContextExtHelper;  
          5. import org.omg.PortableServer.POA;  
          6. import BillingApp.*;  
          7. public class BillingServer {  
          8.  public static void main(String args[]){  
          9.   try{  
          10.    // 創建和初始化ORB  
          11.    ORB orb = ORB.init(args, null);  
          12.    // 獲得根POA的引用并激活POAManager  
          13.    POA rootpoa = (POA)orb.resolve_initial_references("RootPOA");  
          14.    rootpoa.the_POAManager().activate();  
          15.    // 創建servant并注冊到ORB  
          16.    BillingImpl billingImpl = new BillingImpl();  
          17.    billingImpl.setORB(orb);  
          18.    // 從servant獲得對象引用  
          19.    org.omg.CORBA.Object ref = rootpoa.servant_to_reference(billingImpl);  
          20.    Billing href = BillingHelper.narrow(ref);  
          21.    // 得到根命名上下文  
          22.    org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");  
          23.    // 使用命名上下文,它是互操作命名服務規范的一部分  
          24.    NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
          25.    // 在命名中綁定對象引用  
          26.    String name = "Billing";  
          27.    NameComponent path[] = ncRef.to_name(name);  
          28.    ncRef.rebind(path, href);  
          29.    System.out.println("BillingServer is ready and waiting...");  
          30.    // 等待客戶端調用  
          31.    orb.run();  
          32.   }catch(Exception e){  
          33.    System.err.println("ERROR:"+e);  
          34.    e.printStackTrace(System.out);  
          35.   }  
          36.   System.out.println("BillingServer Exiting ...");  
          37.  }  
          38. }  

          4)實現客戶端
          與第三步類似,可以使用idlj產生的stub作為客戶端應用程序的基礎??蛻舳舜a建立于stub之上,啟動ORB,使用服務器提供的命名服務查詢,獲得遠程對象的引用,調用其方法。
          【BillingClient.java源碼】:

          1. import org.omg.CORBA.ORB;  
          2. import org.omg.CosNaming.NamingContextExt;  
          3. import org.omg.CosNaming.NamingContextExtHelper;  
          4. import BillingApp.*;  
          5. public class BillingClient {  
          6.  static Billing billingImpl;  
          7.  public static void main(String args[]){  
          8.   try{  
          9.    // 創建和初始化ORB  
          10.    ORB orb = ORB.init(args, null);  
          11.    System.out.println("ORB initialised");  
          12.    // 獲得根命名上下文  
          13.    org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");  
          14.    // 使用NamingContextExt代替命名上下文,它是互操作命名服務的一部分  
          15.    NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);  
          16.    // 在命名中解析對象引用  
          17.    String name = "Billing";  
          18.    billingImpl = BillingHelper.narrow(ncRef.resolve_str(name));  
          19.      
          20.    System.out.println("Obtained a handle on server object: "+billingImpl);  
          21.    System.out.println(billingImpl.successBilling());  
          22.    billingImpl.shutdown();  
          23.   }catch(Exception e){  
          24.    System.out.println("ERROR: "+e);  
          25.    e.printStackTrace(System.out);  
          26.   }  
          27.  }  
          28. }  


          5)啟動應用程序
          要運行服務器和客戶端,必須先啟動命名服務,再啟動服務器,最后運行客戶端。
          此例用到命名服務,它使得servant對象的操作對客戶端有效。服務器需要命名服務的對象引用,命名服務可以發布對象引用實現各種接口??蛻舳耸褂脤ο笠脕碚{用方法。
          Java SE 1.4以上提供了兩種可選的命名服務:
          · tnameserv
          一種透明的命名服務
          · orbd
          包含自啟動服務、透明的命名服務、持久化命名服務和命名管理器的后臺處理進程。
          本例使用orbd。

          5.1)啟動orbd
          注意:Solaris系統運行要求root權限并以1024端口開始進程。因此,對所有OS,可以選用大于或等于1024的端口以實現統一。
          -ORBInitialPort選項用于指定端口(非缺省狀態)。
          例如:假定使用1050端口的Java ORB Daemon(orbd),命令如下:
          start orbd -ORBInitialPort 1050 -ORBInitialHost localhost

          5.2)開始Billing服務器
          start java BillingServer -ORBInitialPort 1050 -ORBInitialHost localhost
          注:如在同一臺主機上運行,可省略-ORBInitialHost localhost

          5.3)運行客戶端應用程序
          java BillingClient -ORBInitialPort 1050 -ORBInitialHost localhost

          posted @ 2009-11-16 11:05 whoami 閱讀(386) | 評論 (0)編輯 收藏

          一、 使用到的軟件
          1. corba產品:OpenORB
          下載地址:
          http://sourceforge.net/projects/openorb/
          解壓后如下圖所示



          2. 開發工具Eclipse 3.4.2


          3. 插件:ORBStudio777
          下載地址:.
          ftp://www.orbzone.org 用戶名稱:orbzone_downloads 密碼:orbzone_downloads
          使用第三方Ftp工具或者迅雷的資源探測器登陸后進入CORBA_Utilities文件夾,下面有3個zip壓縮文件ORBStudio 775, ORBStudio776, ORBStudio777 ,我選擇了777下載。
          解壓后如下圖所示

          4. Javacc
          下載javacc,網址:
          https://javacc.dev.java.net/
          解壓后如下圖所示

          二、安裝配置
          1. 解壓OpenOrb.rar
          2. 解壓ORBStudio777.zip,從ORBStudio/plugins/下面取得 ORBStudio_7.7.7.jar 的JAR包放到Eclipse/plugins下面.我用的Eclipse版本是Eclipse3.4.2。如果考入Jar包前以前Eclipse是運行 的請關閉,重新運行。
          3. 運行CMD 到DOS,再到存放javacc的bin目錄,輸入 javacc -tm D:\Eclipse3.22\eclipse\ORBStudio\IDLParser.jj

          4. 添加環境變量TCOO_HOME,值為OpenOrb目錄的路徑
          5. 啟動eclipse
          6. windows/preferences/出現如下窗口選擇ORB Studio/IDL Compiler/ 在右邊選擇OpenORB這里有5種編譯器我們使用JacORB. 打開IDL Compiler 前面的加號選擇

          右邊參數IDL Command: D:\ComponentTechnology\OpenOrb\OpenORB\bin\idl2java.bat
          Command Options: -d %D% %F%

          這樣就配置成功了Eclipse下面的Corba開發。Eclipse的新建選擇如圖:


          三、開發步驟參考
          1. 在eclipse里新建項目,Project lauyout 選擇Create separate source and output folders

          2. 給新項目添加Libraries,右鍵Properites--->Libraries--->Add Library--->User Library--->User Libraries...--->New...--->Add JARs...
          找到OpenOrb\OpenORB\lib目錄下openorb_orb-1.4.0.jar,openorb_orb_tools-1.4.0.jar
          OpenOrb\OpenORB\lib\endorsed目錄下openorb_orb_omg-1.4.0.jar
          OpenOrb\tools\lib目錄下launcher.jar,tools-1.4.0.jar
          OpenOrb\tools\lib\ext目錄下所有.jar文件

          3. src上右鍵New--->Other--->CORBA Wizard--->IDL files--->Simple IDL

          4. 選擇IDL文件,右鍵ORB Menu--->Compile,就自動生成文件

          5. src上右鍵New--->Other--->CORBA Wizard--->Server--->Active object map--->Next在彈出的對話框里IDL filename欄選擇/{projectName}/src/{IDLname}.idl
              Interface欄選擇IDL文件里定義的接口名
              Package欄里填寫包名
              Server classname欄里填寫服務端類名
          --->Next 在彈出的對話框,選中Create server class:項

          6. 為生成的服務端類添加未實現的方法,并填寫方法體

          7. src 上右鍵New--->Other--->CORBA Wizard--->Client--->Simple implementation 在彈出的對話框里IDL filename欄選擇/{projectName}/src/{IDLname}.idl
              Interface欄選擇IDL文件里定義的接口名
              Package欄里填寫包名
              Client classname欄里填寫客戶端類名

          8. 在客戶端類的main方法里,取消注釋test.getORBInterface().operation1("A message in the bottle..."); 并修改傳遞的String內容

          9. 運行服務端程序Server_AOM.java,然后運行客戶端程序MyServiceClientImpl.java

          如果,你要將你的程序包發布到別的機器上,就要用到名稱服務,使用名稱服務,我們需要在java代碼上作些修改:

          使用名稱空間的配置:

          1. 找到并注釋服務端Server_AOM.java里main方法的下列代碼:

          PrintWriter ps = new PrintWriter(new FileOutputStream(new File("server.ior")));
          ps.println(orb.object_to_string(obj));
          ps.close();

          取消下列代碼(位置在上面代碼的上方)的注釋:

          // org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");
          // NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
          // nc.bind(nc.to_name("MyServerObject"), obj);

          修改bind方法為rebind,并引入新的類


          2. 找到并注釋客戶端MyServiceClientImpl.java里main方法的下列代碼:

          LineNumberReader input = new LineNumberReader(new FileReader("server.ior"));
          String ior = input.readLine();
          org.omg.CORBA.Object obj = orb.string_to_object(ior);

          取消下列代碼(位置在上面代碼的上方)的注釋:

          // org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");
          // NamingContextExt nc = NamingContextExtHelper.narrow(ncobj);
          // org.omg.CORBA.Object obj = nc.resolve_str("MyServerObject");

          引入新的類

          修改org.omg.CORBA.Object ncobj = orb.resolve_initial_references("NameService");里面的參數,服務端Server_AOM.java也要改。

          改為"corbaloc::1.2@hostname:portNumber/NameService"

          修改resolve_initial_references方法為string_to_object

          修改所有異常為Exception


          3. 用命令行的方式,在OpenOrb\NamingService\bin目錄下執行ins -ORBPort=portNumber


          4. 帶參數 -ORBInitRef NameService=corbaloc::1.2@hostname:portNumber/NameService 運行服務端Server_AOM.java,


          5. 然后運行客戶端程序MyServiceClientImpl.java,結果是一樣的。

          目前為止,corba的本地、遠程開發都已經配置完畢。

          posted @ 2009-11-16 09:42 whoami 閱讀(1150) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 彭州市| 福州市| 贵德县| 蓝山县| 崇仁县| 内丘县| 深泽县| 且末县| 长海县| 汕头市| 公主岭市| 新乐市| 渑池县| 林州市| 石阡县| 连南| 岚皋县| 绵阳市| 伊川县| 县级市| 页游| 五指山市| 尉氏县| 西青区| 九寨沟县| 囊谦县| 奉节县| 怀远县| 镇雄县| 长兴县| 山东| 丽水市| 民丰县| 桃源县| 会宁县| 嫩江县| 邵东县| 双峰县| 青川县| 尉犁县| 通渭县|