云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理


          1. 自動掃描配置文件改動
          <configuration scan="true" scanPeriod="30 seconds">
          ....
          </configuration

          2. 日志每天歸檔,同時目錄名包含相應的年份和月份
          <fileNamePattern>F:\Programs\GlobalPos\GatewayCiti\logs\%d{yyyy/MM,aux}\G%d{dd}-%i.log</fileNamePattern>
          注意其中aux的使用,在fileNamePatter中如果出現多個%d的情況下,只能有一個為主配置,其他都需要使用aux標記為附屬配置
          其中的%i請參看下節的介紹

          3. 文件同時根據日期和大小滾動創建
                  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                      <!-- rollover daily -->
                      <!-- 
                      <fileNamePattern>F:\Programs\GlobalPos\NetReport\logs\Portal-%d{yyyyMMdd}.log</fileNamePattern>
                      
          -->
                      
                      <!-- Size and time based archiving -->
                      <fileNamePattern>D:\logs\%d{yyyy/MM,aux}\L%d{dd}-%i.log</fileNamePattern>
                      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                          <maxFileSize>100MB</maxFileSize>
                      </timeBasedFileNamingAndTriggeringPolicy>            
                  </rollingPolicy>

          fileNamePattern在上一節已經介紹,這里主要介紹timeBasedFileNamingAndTriggeringPolicy,此處配置對文件大小的限定,由fileNamePattern的%i在確定下標在文件名中的位置
          此示例產生的日志文件將會是:
          D:\logs\2015\01\L05-0.log 
          如果該文件大于100M,就會生成D:\logs\2015\01\L05-1.log

          posted @ 2015-01-07 09:40 云自無心水自閑 閱讀(7373) | 評論 (0)編輯 收藏

          OpenPGP 號稱是世界上使用最廣泛的郵件加密標準.  OpenPGP is the most widely used email encryption standard in the world. ( http://www.openpgp.org/ )
          這篇例子介紹如何使用這個標準進行文件的加密解密 (https://www.bouncycastle.org/latest_releases.html, 需要下載: bcprov-jdk15on-151.jar, bcpg-jdk15on-151.jar).

          主要是使用bouncycastle提供的OpenPGP的庫來完成這個功能,參照了其提供的示例程序,進行了部分改動 ( Bouncy Castle 是一種用于 Java 平臺的開放源碼的輕量級密碼術包。它支持大量的密碼術算法,并提供 JCE 1.2.1 的實現。因為 Bouncy Castle 被設計成輕量級的,所以從 J2SE 1.4 到 J2ME(包括 MIDP)平臺,它都可以運行。它是在 MIDP 上運行的唯一完整的密碼術包。)
          1. 添加循環遍歷來查找第一個可用的message
          2. 需要注意的是在main函數中的,如果不添加這一句的話 Security.addProvider(new BouncyCastleProvider()); 程序運行中會報錯:No such Provider "BC"
          3. 
          錯誤Exception in thread "main" java.security.InvalidKeyException: Illegal key size or default parameters , 這是因為java缺省的庫支持的key長度比較短,需要到oracle的網站上去下載一個支持更長key的庫覆蓋原有的庫文件
          <JAVA_HOME>/lib/securty/ 目錄下的兩個jar文件
          local_policy.jar and US_export_policy.jar
          搜索這個文件: Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files

          package org.bouncycastle.openpgp.examples;

          import java.io.BufferedInputStream;
          import java.io.BufferedOutputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.OutputStream;
          import java.security.NoSuchProviderException;
          import java.security.SecureRandom;
          import java.security.Security;
          import java.util.Iterator;

          import org.bouncycastle.bcpg.ArmoredOutputStream;
          import org.bouncycastle.bcpg.CompressionAlgorithmTags;
          import org.bouncycastle.jce.provider.BouncyCastleProvider;
          import org.bouncycastle.openpgp.PGPCompressedData;
          import org.bouncycastle.openpgp.PGPEncryptedData;
          import org.bouncycastle.openpgp.PGPEncryptedDataGenerator;
          import org.bouncycastle.openpgp.PGPEncryptedDataList;
          import org.bouncycastle.openpgp.PGPException;
          import org.bouncycastle.openpgp.PGPLiteralData;
          import org.bouncycastle.openpgp.PGPOnePassSignatureList;
          import org.bouncycastle.openpgp.PGPPrivateKey;
          import org.bouncycastle.openpgp.PGPPublicKey;
          import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData;
          import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
          import org.bouncycastle.openpgp.PGPSignatureList;
          import org.bouncycastle.openpgp.PGPUtil;
          import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
          import org.bouncycastle.openpgp.operator.jcajce.JcaKeyFingerprintCalculator;
          import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
          import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
          import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
          import org.bouncycastle.util.io.Streams;

          /**
           * A simple utility class that encrypts/decrypts public key based
           * encryption files.
           * <p>
           * To encrypt a file: KeyBasedFileProcessor -e [-a|-ai] fileName publicKeyFile.<br>
           * If -a is specified the output file will be "ascii-armored".
           * If -i is specified the output file will be have integrity checking added.
           * <p>
           * To decrypt: KeyBasedFileProcessor -d fileName secretKeyFile passPhrase.
           * <p>
           * Note 1: this example will silently overwrite files, nor does it pay any attention to
           * the specification of "_CONSOLE" in the filename. It also expects that a single pass phrase
           * will have been used.
           * <p>
           * Note 2: if an empty file name has been specified in the literal data object contained in the
           * encrypted packet a file with the name filename.out will be generated in the current working directory.
           
          */
          public class KeyBasedFileProcessor
          {
              private static void decryptFile(
                  String inputFileName,
                  String keyFileName,
                  char[] passwd,
                  String defaultFileName)
                  throws IOException, NoSuchProviderException
              {
                  InputStream in = new BufferedInputStream(new FileInputStream(inputFileName));
                  InputStream keyIn = new BufferedInputStream(new FileInputStream(keyFileName));
                  decryptFile(in, keyIn, passwd, defaultFileName);
                  keyIn.close();
                  in.close();
              }

              /**
               * decrypt the passed in message stream
               
          */
              private static void decryptFile(
                  InputStream in,
                  InputStream keyIn,
                  char[]      passwd,
                  String      defaultFileName)
                  throws IOException, NoSuchProviderException
              {
                  in = PGPUtil.getDecoderStream(in);
                  
                  try
                  {
                      JcaPGPObjectFactory pgpF = new JcaPGPObjectFactory(in);
                      PGPEncryptedDataList    enc;

                      Object                  o = pgpF.nextObject();
                      //
                      
          // the first object might be a PGP marker packet.
                      
          //
                      if (o instanceof PGPEncryptedDataList)
                      {
                          enc = (PGPEncryptedDataList)o;
                      }
                      else
                      {
                          enc = (PGPEncryptedDataList)pgpF.nextObject();
                      }
                      
                      //
                      
          // find the secret key
                      
          //
                      Iterator                    it = enc.getEncryptedDataObjects();
                      PGPPrivateKey               sKey = null;
                      PGPPublicKeyEncryptedData   pbe = null;
                      PGPSecretKeyRingCollection  pgpSec = new PGPSecretKeyRingCollection(
                          PGPUtil.getDecoderStream(keyIn), new JcaKeyFingerprintCalculator());

                      while (sKey == null && it.hasNext())
                      {
                          pbe = (PGPPublicKeyEncryptedData)it.next();
                          
                          sKey = PGPExampleUtil.findSecretKey(pgpSec, pbe.getKeyID(), passwd);
                      }
                      
                      if (sKey == null)
                      {
                          throw new IllegalArgumentException("secret key for message not found.");
                      }
              
                      InputStream         clear = pbe.getDataStream(new JcePublicKeyDataDecryptorFactoryBuilder().setProvider("BC").build(sKey));
                      
                      JcaPGPObjectFactory    plainFact = new JcaPGPObjectFactory(clear);
                      
                      Object              message = plainFact.nextObject();
              
                      while ( true ) {
                          if (message instanceof PGPCompressedData)
                          {
                              PGPCompressedData   cData = (PGPCompressedData)message;
                              JcaPGPObjectFactory    pgpFact = new JcaPGPObjectFactory(cData.getDataStream());
                              
                              message = pgpFact.nextObject();
                          }
                          
                          if (message instanceof PGPLiteralData)
                          {
                              PGPLiteralData ld = (PGPLiteralData)message;

                              String outFileName = ld.getFileName();
                              if (outFileName.length() == 0)
                              {
                                  outFileName = defaultFileName;
                              }

                              InputStream unc = ld.getInputStream();
                              OutputStream fOut = new BufferedOutputStream(new FileOutputStream(outFileName));

                              Streams.pipeAll(unc, fOut);

                              fOut.close();
                              break;
                          }
                          else if (message instanceof PGPOnePassSignatureList)
                          {
                              System.out.println("encrypted message contains a signed message - not literal data.");
                          }
                          else if (message instanceof PGPSignatureList)
                          {
                              System.out.println("encrypted message contains a signed message - not literal data.");
                          }
                          else
                          {
                              throw new PGPException("message is not a simple encrypted file - type unknown.");
                          }
                          message = plainFact.nextObject();
                      }
                      
                      if (pbe.isIntegrityProtected())
                      {
                          if (!pbe.verify())
                          {
                              System.err.println("message failed integrity check");
                          }
                          else
                          {
                              System.err.println("message integrity check passed");
                          }
                      }
                      else
                      {
                          System.err.println("no message integrity check");
                      }
                  }
                  catch (PGPException e)
                  {
                      System.err.println(e);
                      if (e.getUnderlyingException() != null)
                      {
                          e.getUnderlyingException().printStackTrace();
                      }
                  }
              }

              private static void encryptFile(
                  String          outputFileName,
                  String          inputFileName,
                  String          encKeyFileName,
                  boolean         armor,
                  boolean         withIntegrityCheck)
                  throws IOException, NoSuchProviderException, PGPException
              {
                  OutputStream out = new BufferedOutputStream(new FileOutputStream(outputFileName));
                  PGPPublicKey encKey = PGPExampleUtil.readPublicKey(encKeyFileName);
                  encryptFile(out, inputFileName, encKey, armor, withIntegrityCheck);
                  out.close();
              }

              private static void encryptFile(
                  OutputStream    out,
                  String          fileName,
                  PGPPublicKey    encKey,
                  boolean         armor,
                  boolean         withIntegrityCheck)
                  throws IOException, NoSuchProviderException
              {
                  if (armor)
                  {
                      out = new ArmoredOutputStream(out);
                  }

                  try
                  {
                      byte[] bytes = PGPExampleUtil.compressFile(fileName, CompressionAlgorithmTags.ZIP);

                      PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(
                          new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5).setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(new SecureRandom()).setProvider("BC"));

                      encGen.addMethod(new JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider("BC"));

                      OutputStream cOut = encGen.open(out, bytes.length);

                      cOut.write(bytes);
                      cOut.close();

                      if (armor)
                      {
                          out.close();
                      }
                  }
                  catch (PGPException e)
                  {
                      System.err.println(e);
                      if (e.getUnderlyingException() != null)
                      {
                          e.getUnderlyingException().printStackTrace();
                      }
                  }
              }

              public static void main(
                  String[] args)
                  throws Exception
              {
                  Security.addProvider(new BouncyCastleProvider());

                  if (args.length == 0)
                  {
                      System.err.println("usage: KeyBasedFileProcessor -e|-d [-a|ai] file [secretKeyFile passPhrase|pubKeyFile]");
                      return;
                  }

                  if (args[0].equals("-e"))
                  {
                      if (args[1].equals("-a") || args[1].equals("-ai") || args[1].equals("-ia"))
                      {
                          encryptFile(args[2] + ".asc", args[2], args[3], true, (args[1].indexOf('i') > 0));
                      }
                      else if (args[1].equals("-i"))
                      {
                          encryptFile(args[2] + ".bpg", args[2], args[3], falsetrue);
                      }
                      else
                      {
                          encryptFile(args[1] + ".bpg", args[1], args[2], falsefalse);
                      }
                  }
                  else if (args[0].equals("-d"))
                  {
                      decryptFile(args[1], args[2], args[3].toCharArray(), new File(args[1]).getName() + ".out");
                  }
                  else
                  {
                      System.err.println("usage: KeyBasedFileProcessor -d|-e [-a|ai] file [secretKeyFile passPhrase|pubKeyFile]");
                  }
              }
          }


          asdf

          posted @ 2014-12-10 06:50 云自無心水自閑 閱讀(11816) | 評論 (5)編輯 收藏

           Netty作為一個異步非阻塞式的框架,是不允許在ChannelHandler中長時間處理事務(比如數據庫的操作),阻塞I/O的讀寫處理的。

          在Netty in Action中是這樣描述的:
          While the I/O thread must not be blocked at all, thus prohibiting any direct blocking operations within your ChannelHandler, there is a way to implement this requirement. 
          You can specify an EventExecutorGroup when adding ChannelHandlers to the ChannelPipeline. 
          This EventExecutorGroup will then be used to obtain an EventExecutor, which will execute all the methods of the ChannelHandler. 
          This EventExecutor will use a different thread from the I/O thread, thus freeing up the EventLoop.
          I/O線程是不允許被阻塞的,也就是不能在ChannelHandler中進行任何阻塞式的處理,但是對此我們也有相應的解決方法.
          就是在把ChannelHanders添加到ChannelPipeline的時候,指定一個EventExecutorGroup,ChannelHandler中所有的方法都將會在這個指定的EventExecutorGroup中運行。
          而這個EVentExecutorGroup運行的線程與I/O線程不同,達到不阻塞I/O的目的。 
          程序示例如下:
          Channel ch = ...;
          ChannelPipeline p = ch.pipeline();
          EventExecutor e1 = new DefaultEventExecutorGroup(16);
          EventExecutor e2 = new DefaultEventExecutorGroup(8);
           
          p.addLast(new MyProtocolCodec());
          p.addLast(e1, new MyDatabaseAccessingHandler());
          p.addLast(e2, new MyHardDiskAccessingHandler());
          需要補充說明一下,上面的示例程序似乎有點問題。使用上述方法添加ChannelHandler到pipeline中以后,channelHandler的所有方法確實什么在一個單獨的線程中被處理。
          但是,每次DefaultEventExcutorGroup線程池中的線程不能被重用,每次都會生成一個新的線程,然后在新的線程中調用ChannelHandler, 在visualvm可以看到線程數量直線增長。

          解決的方法是:不能使用局部變量形式的DefaultEventExecutorGroup。而使用類靜態成員變量:
          static final EventExecutor e1 = new DefaultEventExecutorGroup(16);

          我分析原因可能是:在新的連接到來,創建ChannelPipeline給新Channel的時候,如果不使用靜態的共享變量,而使用局部變量的話,就造成DefaultEventExecutorGroup被多次重復創建。因此,雖然一個DefaultEventExecutorGroup中的Thread數量是固定的,但是卻產生了多余的DefaultEventExecutorGroup。從VisualVM中也可以看到,DefaultEventExecutorGroup線程的名字會是:
          xxx-2-1
          xxx-3-1
          xxx-4-1
          xxx-n-1
          說明是Group的數量(第一個數字)在增多,而不是Group中的線程數量(第二個數字)在增多
          改成靜態變量后,線程名會是:
          xxx-2-1
          xxx-2-2
          xxx-2-3
          xxx-2-n
          最后一個n就是在創建DefaultEventExecutorGroup時候,傳入的線程個數參數的大小。

          posted @ 2014-11-27 07:36 云自無心水自閑 閱讀(9868) | 評論 (0)編輯 收藏

          Netty
          1. there're 2 EventLoopGroup in netty, bossGroup and workerGroup, (1 implementation NioEventLoopGroup is a kind of thread pool)
          2. bossGroup is Acceptor,is responsible for creating Channels for incoming connection requests
          3. workerGroup is the Reactor/Selector?, handling I/O requests. 
          4. a thread in bossGroup will be listening in the port, Once a connection has been accepted workerGroup assigns an EventLoop to its Channel
          5. multiple channels can be registered into 1 EventLoop, multiple EventLoops will exist in workerGroup
          6. workerGroup will iterate all the EventLoop, and iterate all the channels in EventLoop, if any of the channel is ready to execute/process
          7. it will invoke all the channelHandlers in the channelPipeline
          8. ChannelPipelines are containers for chains of ChannelHandlers which executed in order
          9. There are, in fact, two ways of sending messages in Netty. You can write directly to the Channel or write to the ChannelHandlerContext object. The main difference is that the former approach causes the message to start from the tail of the ChannelPipeline, while the latter causes the message to start from the next handler in the ChannelPipeline.
          10. While the I/O thread must not be blocked at all, thus prohibiting any direct blocking operations within your ChannelHandler, there is a way to implement this requirement.
          You can specify an EventExecutorGroup when adding ChannelHandlers to the ChannelPipeline.
          This EventExecutorGroup will then be used to obtain an EventExecutor, which will execute all the methods of the ChannelHandler.
          This EventExecutor will use a different thread from the I/O thread, thus freeing up the EventLoop.

          Channel ch = ...;
          ChannelPipeline p = ch.pipeline();
          EventExecutor e1 = new DefaultEventExecutor(16);
          EventExecutor e2 = new DefaultEventExecutor(8);
           
          p.addLast(new MyProtocolCodec());
          p.addLast(e1, new MyDatabaseAccessingHandler());
          p.addLast(e2, new MyHardDiskAccessingHandler());

          http://stackoverflow.com/questions/12928723/netty-4-eventloopgroup-eventloop-eventexecutor-thread-affinity

          posted @ 2014-11-21 14:18 云自無心水自閑 閱讀(529) | 評論 (0)編輯 收藏

          http://denis.doublebuffer.net/lablog/2012/11/19/fixing-the-screen-flickering-on-a-dell-inspiron-n5720-and-maybe-many-others/
          A Dell Inspiron N5720 has a nVidia GT 630M and an Intel HD Graphics 4000. Let’s see what the Intel Graphics Control panel looks like. To open it, follow these instructions.
          Select Advanced mode.
          Go to the Power menu and change the power source to “On battery”. Now uncheck the little check box that says “Display Refresh Rate Switch”. Apply. OK. And you’re done.

          posted @ 2014-02-14 19:58 云自無心水自閑 閱讀(549) | 評論 (0)編輯 收藏

          Where are the Database Files Stored?

          When using database URLs like jdbc:h2:~/test, the database is stored in the user directory. For Windows, this is usually C:\Documents and Settings\<userName> or C:\Users\<userName>. If the base directory is not set (as in jdbc:h2:test), the database files are stored in the directory where the application is started (the current working directory). When using the H2 Console application from the start menu, this is<Installation Directory>/bin. The base directory can be set in the database URL. A fixed or relative path can be used. When using the URL jdbc:h2:file:data/sample, the database is stored in the directory data(relative to the current working directory). The directory is created automatically if it does not yet exist. It is also possible to use the fully qualified directory name (and for Windows, drive name). Example:jdbc:h2:file:C:/data/tes

          posted @ 2014-01-29 18:58 云自無心水自閑 閱讀(686) | 評論 (0)編輯 收藏

           在主動模式下,FTP客戶端隨機開啟一個大于1024的端口N向服務器的21號端口發起連接,然后開放N+1號端口進行監聽,并向服務器發出PORT N+1命令。服務器接收到命令后,會用其本地的FTP數據端口(通常是20)來連接客戶端指定的端口N+1,進行數據傳輸。     
          在被動模式下,FTP庫戶端隨機開啟一個大于1024的端口N向服務器的21號端口發起連接,同時會開啟N+1號端口。然后向服務器發送PASV命令,通知服務器自己處于被動模式。服務器收到命令后,會開放一個大于1024的端口P進行監聽,然后用PORT P命令通知客戶端,自己的數據端口是P。客戶端收到命令后,會通過N+1號端口連接服務器的端口P,然后在兩個端口之間進行數據傳輸。    
           總的來說,主動模式的FTP是指服務器主動連接客戶端的數據端口,被動模式的FTP是指服務器被動地等待客戶端連接自己的數據端口。     

          被動模式的FTP通常用在處于防火墻之后的FTP客戶訪問外界FTp服務器的情況,因為在這種情況下,防火墻通常配置為不允許外界訪問防火墻之后主機,而只允許由防火墻之后的主機發起的連接請求通過。
          因此,在這種情況下不能使用主動模式的FTP傳輸,而被動模式的FTP可以良好的工作。

           Standard模式FTP 客戶端首先和FTP Server的TCP 21端口建立連接,通過這個通道發送命令,客戶端需要接收數據的時候在這個通道上發送PORT命令。 PORT命令包含了客戶端用什么端口接收數據。
          在傳送數據的時候,服務器端通過自己的TCP 20端口發送數據。 FTP server必須和客戶端建立一個新的連接用來傳送數據。     
           Passive模式在建立控制通道的時候和Standard模式類似,當客戶端通過這個通道發送PASV 命令的時候,FTP server打開一個位于1024和5000之間的隨機端口并且通知客戶端在這個端口上傳送數據的請求, 然后FTP server 將通過這個端口進行數據的傳送,這個時候FTP server不再需要建立一個新的和客戶端之間的連接。 

          posted @ 2014-01-28 08:54 云自無心水自閑 閱讀(586) | 評論 (0)編輯 收藏


          java.awt.Desktop is the class you're looking for.

          import java.awt.Desktop; 
          import java.net.URI;
          // ...
          if(Desktop.isDesktopSupported()) {
          Desktop.getDesktop().browse(new URI("http://www.example.com"));
          }


          If you're using Java 6 or above, see the Desktop API, in particular browse. Use it like this (not tested):

          // using this in real life, you'd probably want to check that the desktop
          // methods are supported using isDesktopSupported()...
          
          String htmlFilePath = "path/to/html/file.html"; // path to your new file
          File htmlFile = new File(htmlFilePath);
          
          // open the default web browser for the HTML page
          Desktop.getDesktop().browse(htmlFile.toURI());
          
          // if a web browser is the default HTML handler, this might work too
          Desktop.getDesktop().open(htmlFile);

          posted @ 2014-01-27 21:09 云自無心水自閑 閱讀(415) | 評論 (0)編輯 收藏

          例子:
          java -cp bin;lib/* org.kevin.task.RunJobA f:\temp\jobs


          1.路徑中需要使用/,而不是\\,
          2.只能用一個*,不需要添加后綴, 

          posted @ 2013-12-09 14:22 云自無心水自閑 閱讀(470) | 評論 (0)編輯 收藏

          P66
          1. components:
              a. Message
                  a.1 Header
          a.1.1 Destination
          a.1.2 DeliveryMode: persistent, non-persistent
          a.2 Body
              b. Queue
              c. Client
                  c.1 Producer
                  c.2 Consumer - Message Selector
          d. Domain, 2 styles of messaging
          d.1 point-to-point
          d.1.1 destination known as QUEUE
          d.1.2 similar to person to person email sent through a mail server
          d.1.3 multiple consumers can be registered on a single queue
          but only one consumer will receive a a given messge 
          and it's upt to that consumer to acknowledge the message
          d.2 publish-subscribe
          d.2.1 destination known as TOPICS
          d.2.2 publishers send messages to the topic 
          and subscribers register to receive messages from the topic
          d.2.3 durable subscriptions allow for subscriber disconnection without missing any messages

          posted @ 2013-10-14 20:35 云自無心水自閑 閱讀(501) | 評論 (0)編輯 收藏

          僅列出標題
          共29頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 Last 
          主站蜘蛛池模板: 云梦县| 张家口市| 香河县| 罗江县| 九江市| 龙口市| 栾城县| 弋阳县| 长治市| 瑞昌市| 蒲江县| 高台县| 泸溪县| 阳春市| 九寨沟县| 三河市| 友谊县| 揭东县| 玛多县| 邢台市| 博野县| 晋中市| 太保市| 精河县| 那坡县| 无锡市| 青阳县| 芷江| 什邡市| 商都县| 若尔盖县| 宁波市| 米林县| 顺昌县| 佛坪县| 龙海市| 漯河市| 山丹县| 郯城县| 隆子县| 澄城县|