精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

專業!Spring Boot 3.3 集成 iText 實現高效電子簽章

開發 前端
本文介紹了在 Spring Boot 3.3 項目中集成 iText 實現電子簽章的完整流程。通過配置文件管理簽章參數、使用 @ConfigurationProperties? 注入配置、Lombok? 簡化代碼,以及使用 jQuery?與 Thymeleaf 搭建前端界面,我們構建了一個簡單而專業的電子簽章功能。

在現代企業應用中,電子簽章技術在文檔簽署、文件認證和法律效力保障中發揮著重要作用。通過 Bouncy Castle 生成數字證書來加密簽章數據并驗證簽章合法性。本文將介紹如何在 Spring Boot 3.3 項目中集成 iText 實現電子簽章功能,內容涵蓋生成數字證書、繪制簽章圖片、項目配置和代碼示例。

運行效果:

圖片圖片

圖片圖片

若想獲取項目完整代碼以及其他文章的項目源碼,且在代碼編寫時遇到問題需要咨詢交流,歡迎加入下方的知識星球。

使用 Bouncy Castle 生成數字證書

在生成數字證書之前,需要在 pom.xml 中添加 Bouncy Castle 的依賴:

<?xml versinotallow="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>3.3.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.icoderoad</groupId>
	<artifactId>itext_sign_pdf</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>itext_sign_pdf</name>
	<description>Demo project for Spring Boot</description>
	
	<properties>
		<java.version>17</java.version>
	</properties>
	<dependencies>
		<dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-web</artifactId>
	    </dependency>
	    <!-- Thymeleaf -->
	    <dependency>
	        <groupId>org.springframework.boot</groupId>
	        <artifactId>spring-boot-starter-thymeleaf</artifactId>
	    </dependency>
	     <!-- Lombok 依賴 -->
	    <dependency>
	        <groupId>org.projectlombok</groupId>
	        <artifactId>lombok</artifactId>
	        <scope>provided</scope>
	    </dependency>
		<dependency>
		    <groupId>org.bouncycastle</groupId>
		    <artifactId>bcprov-jdk15to18</artifactId>
		    <version>1.78.1</version>
		</dependency>
		<dependency>
		    <groupId>org.bouncycastle</groupId>
		    <artifactId>bcpkix-jdk15to18</artifactId>
		    <version>1.78.1</version>
		</dependency>
		<dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-ext-jdk15to18</artifactId>
        <version>1.78.1</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.13.4</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>html2pdf</artifactId>
        <version>5.0.5</version>
    </dependency>
        
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

然后,可以使用以下代碼生成一個自簽名的數字證書(.p12 文件),用于后續簽章操作:

package com.icoderoad.util;

import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;

import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.*;

public class PkcsUtil {

    /**
     * 生成證書
     *
     * @return
     * @throws NoSuchAlgorithmException
     */
    private static KeyPair getKey() throws NoSuchAlgorithmException {
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA",
                new BouncyCastleProvider());
        generator.initialize(1024);
        // 證書中的密鑰 公鑰和私鑰
        KeyPair keyPair = generator.generateKeyPair();
        return keyPair;
    }

    /**
     * 生成證書
     *
     * @param password
     * @param issuerStr
     * @param subjectStr
     * @param certificateCRL
     * @return
     */
    public static Map<String, byte[]> createCert(String password, String issuerStr, String subjectStr, String certificateCRL) {
        Map<String, byte[]> result = new HashMap<String, byte[]>();
        try(ByteArrayOutputStream out= new ByteArrayOutputStream()) {
            // 標志生成PKCS12證書
            KeyStore keyStore = KeyStore.getInstance("PKCS12", new BouncyCastleProvider());
            keyStore.load(null, null);
            KeyPair keyPair = getKey();
            // issuer與 subject相同的證書就是CA證書
            X509Certificate cert = generateCertificateV3(issuerStr, subjectStr,
                    keyPair, result, certificateCRL);
            // 證書序列號
            keyStore.setKeyEntry("cretkey", keyPair.getPrivate(),
                    password.toCharArray(), new X509Certificate[]{cert});
            cert.verify(keyPair.getPublic());
            keyStore.store(out, password.toCharArray());
            byte[] keyStoreData = out.toByteArray();
            result.put("keyStoreData", keyStoreData);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 生成證書
     * @param issuerStr
     * @param subjectStr
     * @param keyPair
     * @param result
     * @param certificateCRL
     * @return
     */
    public static X509Certificate generateCertificateV3(String issuerStr,
                                                        String subjectStr, KeyPair keyPair, Map<String, byte[]> result,
                                                        String certificateCRL) {
        ByteArrayInputStream bint = null;
        X509Certificate cert = null;
        try {
            PublicKey publicKey = keyPair.getPublic();
            PrivateKey privateKey = keyPair.getPrivate();
            Date notBefore = new Date();
            Calendar rightNow = Calendar.getInstance();
            rightNow.setTime(notBefore);
            // 日期加1年
            rightNow.add(Calendar.YEAR, 1);
            Date notAfter = rightNow.getTime();
            // 證書序列號
            BigInteger serial = BigInteger.probablePrime(256, new Random());
            X509v3CertificateBuilder builder = new JcaX509v3CertificateBuilder(
                    new X500Name(issuerStr), serial, notBefore, notAfter,
                    new X500Name(subjectStr), publicKey);
            JcaContentSignerBuilder jBuilder = new JcaContentSignerBuilder(
                    "SHA1withRSA");
            SecureRandom secureRandom = new SecureRandom();
            jBuilder.setSecureRandom(secureRandom);
            ContentSigner singer = jBuilder.setProvider(
                    new BouncyCastleProvider()).build(privateKey);
            // 分發點
            ASN1ObjectIdentifier cRLDistributionPoints = new ASN1ObjectIdentifier(
                    "2.5.29.31");
            GeneralName generalName = new GeneralName(
                    GeneralName.uniformResourceIdentifier, certificateCRL);
            GeneralNames seneralNames = new GeneralNames(generalName);
            DistributionPointName distributionPoint = new DistributionPointName(
                    seneralNames);
            DistributionPoint[] points = new DistributionPoint[1];
            points[0] = new DistributionPoint(distributionPoint, null, null);
            CRLDistPoint cRLDistPoint = new CRLDistPoint(points);
            builder.addExtension(cRLDistributionPoints, true, cRLDistPoint);
            // 用途
            ASN1ObjectIdentifier keyUsage = new ASN1ObjectIdentifier(
                    "2.5.29.15");
            // | KeyUsage.nonRepudiation | KeyUsage.keyCertSign
            builder.addExtension(keyUsage, true, new KeyUsage(
                    KeyUsage.digitalSignature | KeyUsage.keyEncipherment));
            // 基本限制 X509Extension.java
            ASN1ObjectIdentifier basicConstraints = new ASN1ObjectIdentifier(
                    "2.5.29.19");
            builder.addExtension(basicConstraints, true, new BasicConstraints(
                    true));
            X509CertificateHolder holder = builder.build(singer);
            CertificateFactory cf = CertificateFactory.getInstance("X.509");
            bint = new ByteArrayInputStream(holder.toASN1Structure()
                    .getEncoded());
            cert = (X509Certificate) cf.generateCertificate(bint);
            byte[] certBuf = holder.getEncoded();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            // 證書數據
            result.put("certificateData", certBuf);
            //公鑰
            result.put("publicKey", publicKey.getEncoded());
            //私鑰
            result.put("privateKey", privateKey.getEncoded());
            //證書有效開始時間
            result.put("notBefore", format.format(notBefore).getBytes("utf-8"));
            //證書有效結束時間
            result.put("notAfter", format.format(notAfter).getBytes("utf-8"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bint != null) {
                try {
                    bint.close();
                } catch (IOException e) {
                }
            }
        }
        return cert;
    }

    public static void main(String[] args) throws Exception {
        // CN: 名字與姓氏    OU : 組織單位名稱
        // O :組織名稱  L : 城市或區域名稱  E : 電子郵件
        // ST: 州或省份名稱  C: 單位的兩字母國家代碼
        String issuerStr = "CN=javaboy,OU=開發部,O=路條編程,C=CN,E=happyzjp@gmail.com,L=北京,ST=北京";
        String subjectStr = "CN=javaboy,OU=開發部,O=路條編程,C=CN,E=happyzjp@gmail.com,L=北京,ST=北京";
        String certificateCRL = "http://www.icoderoad.com";
        Map<String, byte[]> result = createCert("89765431", issuerStr, subjectStr, certificateCRL);

        FileOutputStream outPutStream = new FileOutputStream("keystore.p12");
        outPutStream.write(result.get("keyStoreData"));
        outPutStream.close();
        FileOutputStream fos = new FileOutputStream(new File("keystore.cer"));
        fos.write(result.get("certificateData"));
        fos.flush();
        fos.close();
    }

}

運行此工具代碼后,將在當前工程目錄中生成兩個文件:keystore.p12 和 keystore.cer。

  • keystore.cer 文件通常以 DER 或 PEM 格式存儲,包含 X.509 公鑰證書。它不僅包含公鑰,還記錄了證書持有者的相關信息,如姓名、組織、地理位置等。
  • keystore.p12 文件采用 PKCS#12 格式,是一種個人信息交換標準,用于存儲一個或多個證書及其對應的私鑰。.p12 文件是加密的,通常需要密碼才能打開。這種文件格式便于在不同系統或設備之間安全地傳輸和存儲證書和私鑰。

總結來說,.cer 文件通常僅包含公鑰證書,而 .p12 文件則可以包含證書及其對應的私鑰。

使用 Java 代碼繪制簽章圖片

除了數字證書,電子簽章通常還需要一個可視化的簽章圖片。以下代碼將生成一個簡單的簽章圖片,并保存為 PNG 格式文件,供后續簽章操作使用:

CreateSeal 類

package com.icoderoad.itext_sign_pdf.util;

public class CreateSeal{
    public static void main(String[] args) throws Exception {
        Seal seal = new Seal();
        seal.setSize(200);
        SealCircle sealCircle = new SealCircle();
        sealCircle.setLine(4);
        sealCircle.setWidth(95);
        sealCircle.setHeight(95);
        seal.setBorderCircle(sealCircle);
        SealFont mainFont = new SealFont();
        mainFont.setText("路條編程科技有限公司");
        mainFont.setSize(22);
        mainFont.setFamily("隸書");
        mainFont.setSpace(22.0);
        mainFont.setMargin(4);
        seal.setMainFont(mainFont);
        SealFont centerFont = new SealFont();
        centerFont.setText("★");
        centerFont.setSize(60);
        seal.setCenterFont(centerFont);
        SealFont titleFont = new SealFont();
        titleFont.setText("公司專用章");
        titleFont.setSize(16);
        titleFont.setSpace(8.0);
        titleFont.setMargin(54);
        seal.setTitleFont(titleFont);
        seal.draw("公司公章1.png");
    }
}

以上代碼會生成一個帶有指定文本的簽章圖片,可以將圖片路徑配置在 application.yml 中供簽章使用。此代碼生成的 PNG 文件可以直接用于電子簽章過程。最終生成的簽章圖片類似下面這樣:

在這里提到的一些工具類未提供,需要通過加入星球獲取。

項目依賴配置

在 Spring Boot 項目中使用 iText 實現電子簽章功能,需要在 pom.xml 文件中添加相關依賴配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.icoderoad</groupId>
    <artifactId>springboot-signature</artifactId>
    <version>1.0.0</version>
    <dependencies>
        <!-- Spring Boot Starter Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- iText for PDF signature -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.1.13</version>
        </dependency>

        <!-- Lombok for automatic getter, setter generation -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

配置文件 application.yml

為了使電子簽章功能的參數更加靈活,我們在 application.yml 中設置一些配置信息,例如簽章圖片路徑、證書路徑等。通過使用 @ConfigurationProperties 讀取這些配置信息,便于后續開發和維護。

signature:
  image-path: "/path/to/signature.png"
  certificate-path: "/path/to/certificate.p12"
  certificate-password: "yourpassword"
  position:
    x: 400                    # 默認簽章X坐標
    y: 50  										 #距離頁面底部距離

配置類 SignatureProperties

@ConfigurationProperties 注解用于讀取配置文件中的 signature 配置項,將其注入到配置類 SignatureProperties 中,并使用 Lombok 注解簡化代碼。

package com.icoderoad.itext_sign_pdf.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@Data
@Component
@ConfigurationProperties(prefix = "signature")
public class SignatureProperties {

    private String certificatePath;
    private String signImage;
    private String certificatePassword;
    private Position position = new Position();

    @Data
    public static class Position {
        private float x;
        private float y;
    }

}

配置類

package com.icoderoad.itext_sign_pdf.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 添加對/static/**路徑的支持
        registry.addResourceHandler("/static/**")
                .addResourceLocations("classpath:/static/");
    }
}

后端代碼實現:

控制器層

顯示控制類

package com.icoderoad.itext_sign_pdf.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class IndexController {
	
	@GetMapping("/")
    public String index(Model model) {
        return "index";
    }

}

在 SignatureController 中定義一個用于處理簽章請求的接口,并通過注入 SignatureService 完成簽章功能。

package com.icoderoad.itext_sign_pdf.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.icoderoad.itext_sign_pdf.config.SignatureProperties;
import com.icoderoad.itext_sign_pdf.service.SignatureService;

@RestController
@RequestMapping("/api/signature")
public class SignatureController {

    @Autowired
    private SignatureService signatureService;

    @Autowired
    private SignatureProperties signatureProperties;

    @PostMapping("/uploadAndSign")
    public ResponseEntity<String> uploadAndSignPdf(@RequestParam("pdfFile") MultipartFile pdfFile) {
        try {
            // 將上傳的PDF文件保存為臨時文件
            File tempPdfFile = convertMultiPartToFile(pdfFile);

            // 使用配置文件中的參數進行簽章
            byte[] signedPdfData = signatureService.sign(
                signatureProperties.getCertificatePassword(),
                signatureProperties.getCertificatePath(),
                tempPdfFile.getAbsolutePath(),
                signatureProperties.getSignImage(),
                signatureProperties.getPosition().getX(),
                signatureProperties.getPosition().getY()
            );
            
            FileOutputStream f = new FileOutputStream(new File("已簽名11.pdf"));
            f.write(signedPdfData);
            f.close();

            // 刪除臨時文件
            tempPdfFile.delete();

         // 確定 PDF 文件的保存路徑
            String fileName = "簽名文檔.pdf";
            String filePath = "src/main/resources/static/" + fileName; // 保存到 static 目錄
            FileOutputStream fos = new FileOutputStream(new File(filePath));
            fos.write(signedPdfData);
            fos.close();

            // 刪除臨時文件
            tempPdfFile.delete();

            // 生成下載鏈接
            String downloadUrl = "/static/" + URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());

            return ResponseEntity.ok(downloadUrl);

        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(500).body(null);
        }
    }

    private File convertMultiPartToFile(MultipartFile file) throws IOException {
        File convFile = new File(System.getProperty("java.io.tmpdir") + "/" + file.getOriginalFilename());
        try (FileOutputStream fos = new FileOutputStream(convFile)) {
            fos.write(file.getBytes());
        }
        return convFile;
    }
}

前端頁面實現

使用 Thymeleaf 和 jQuery 實現一個簡單的文件上傳和簽章觸發頁面。CDN 加載 jQuery 和 Bootstrap 樣式。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>PDF 簽章</title>
    <link rel="stylesheet" >
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
</head>
<body>
    <div class="container mt-5">
        <h2 class="mb-4">上傳 PDF 文件并添加簽章</h2>
        <form id="signForm">
            <div class="mb-3">
                <label for="pdfFile" class="form-label">選擇 PDF 文件</label>
                <input class="form-control" type="file" id="pdfFile" name="pdfFile" accept=".pdf" required>
            </div>
            <button type="submit" class="btn btn-primary">簽名并獲取下載鏈接</button>
        </form>
        <div id="downloadLink" class="mt-4" style="display: none;">
            <h4>下載鏈接:</h4>
            <a id="pdfDownload" href="#" target="_blank">下載簽名文檔</a>
        </div>
    </div>

    <script>
        $(document).ready(function () {
            $('#signForm').on('submit', function (event) {
                event.preventDefault();
                
                let formData = new FormData(this);
                $.ajax({
                    url: '/api/signature/uploadAndSign',
                    type: 'POST',
                    data: formData,
                    processData: false,
                    contentType: false,
                    success: function (response) {
                        // 顯示下載鏈接
                        $('#downloadLink').show();
                        $('#pdfDownload').attr('href', response);
                    },
                    error: function (err) {
                        alert("簽名失敗,請檢查輸入并重試。");
                    }
                });
            });
        });
    </script>
</body>
</html>

結論

本文介紹了在 Spring Boot 3.3 項目中集成 iText 實現電子簽章的完整流程。通過配置文件管理簽章參數、使用 @ConfigurationProperties 注入配置、Lombok 簡化代碼,以及使用 jQuery與 Thymeleaf 搭建前端界面,我們構建了一個簡單而專業的電子簽章功能。

責任編輯:武曉燕 來源: 路條編程
相關推薦

2024-10-07 08:18:05

SpringBOM管理

2024-10-18 11:32:15

2024-10-08 09:27:04

SpringRESTfulAPI

2024-09-05 09:35:58

CGLIBSpring動態代理

2024-09-26 09:28:06

內存Spring

2024-10-15 10:38:32

2021-12-28 11:13:05

安全認證 Spring Boot

2024-11-11 10:02:37

Spring搜索數據

2024-10-17 11:24:04

2024-10-11 11:46:40

2023-09-01 08:46:44

2025-05-27 07:07:29

2025-04-03 07:56:08

電子簽名合同系統Spring

2024-08-29 08:23:22

EasyOCRSpring文字識別

2018-11-02 15:45:41

Spring BootRedis數據庫

2020-07-14 11:00:12

Spring BootRedisJava

2025-07-01 01:00:00

Spring消息系統Redis

2019-01-15 11:40:14

開發技能代碼

2023-01-10 07:52:15

2020-09-02 17:28:26

Spring Boot Redis集成
點贊
收藏

51CTO技術棧公眾號

伊人狠狠色丁香综合尤物| 久久久久久久久爱| 色综合色综合色综合色综合| 91在线直播| 国产一区久久久| 午夜精品久久久久久99热软件 | 99国产精品久久久| 国产精品美女网站| 国产精品第二十页| 成人精品电影| 欧美精品一区二区在线播放| 国产天堂在线播放| 日本三级在线观看网站 | 国产美女久久久久久| 国产精品午夜av| 欧美伊人精品成人久久综合97| 亚洲第一在线综合在线| 日韩中文字幕影院| 六月丁香婷婷色狠狠久久| 久久久久久尹人网香蕉| 国产精品18在线| 婷婷成人在线| 日韩精品中文字幕在线不卡尤物| 国产精品亚洲二区在线观看| 欧美aaaxxxx做受视频| 中文字幕av资源一区| 国内外成人免费视频| 国产色片在线观看| 免费成人美女在线观看| 欧美性视频精品| 青青草原在线免费观看| 欧美丝袜激情| 亚洲欧美精品一区二区| 在线观看免费视频黄| 久久久久久久久久久久电影| 欧美日韩一级视频| 欧美一级片中文字幕| 成人免费观看在线观看| 亚洲综合激情另类小说区| 一区二区三视频| 国产视频在线看| 99久久精品免费观看| 国产不卡一区二区在线观看| 国产欧美综合视频| 狠狠色丁香久久婷婷综合_中| 国产精品狼人色视频一区| 欧美黄色一级大片| 久久成人精品| 人人澡人人澡人人看欧美| 成人免费看片98欧美| 亚洲成人原创| 欧美一级电影免费在线观看| 天天综合网入口| 一区二区黄色| 97成人精品区在线播放| 日本在线视频免费观看| 欧美特黄a级高清免费大片a级| 久久精品视频99| 伊人久久久久久久久久久久久久| 成人同人动漫免费观看| 深夜福利国产精品| 成人18视频免费69| 香蕉综合视频| 欧美国产日韩免费| 日本一级淫片免费放| 亚洲深夜福利| 国产91亚洲精品| 日本黄色中文字幕| 久久99久久精品| 91视频88av| 成人小说亚洲一区二区三区| 成人黄色在线看| 欧美二区三区在线| av网站在线免费观看| 综合婷婷亚洲小说| 久久人人爽人人爽人人av| av在线私库| 精品成人av一区| 妞干网在线免费视频| 欧美美女被草| 日韩免费电影一区| 免费观看av网站| 欧美码中文字幕在线| 久久夜精品香蕉| 日韩黄色一级大片| 老司机精品视频导航| 亚洲一区制服诱惑| 婷婷在线免费观看| 国产精品女主播av| 欧美激情亚洲天堂| 午夜激情成人网| 欧美一区二区视频网站| yy6080午夜| 日韩电影免费网站| 久久久久久久久电影| 国产一级片一区二区| 国产精品1区2区3区| 久热这里只精品99re8久| av在线播放av| 精品久久久久久亚洲国产300| 中文久久久久久| 大陆精大陆国产国语精品| 亚洲欧美色婷婷| 欧美人妻精品一区二区免费看| 亚洲一区二区三区高清| 91精品视频免费看| 免费毛片在线| 亚洲一区二区av在线| 国内自拍视频网| 日韩啪啪网站| 欧美成人一区二区三区电影| 无码人妻丰满熟妇精品区| 国产91精品入口| 亚洲人成网站在线播放2019| 久久男人天堂| 精品粉嫩aⅴ一区二区三区四区| 国产精品情侣呻吟对白视频| 亚洲黄色大片| 亚洲综合av影视| 91社区在线高清| 第一福利永久视频精品| zjzjzjzjzj亚洲女人| 91精品国产麻豆国产在线观看| 日韩av成人在线观看| 黑人精品一区二区| 日韩理论在线观看| 亚洲一区在线不卡| 欧美禁忌电影| 国产91精品久久久久久久| 成人午夜精品福利免费| 亚洲欧美区自拍先锋| 伊人国产在线视频| 禁断一区二区三区在线| 欧美专区在线播放| 日本高清视频网站| 亚洲国产wwwccc36天堂| 亚洲熟妇一区二区| 你懂的国产精品| 亚洲www在线| 成人午夜在线影视| 欧美美女一区二区在线观看| 日本美女bbw| 三级精品在线观看| 日本欧美色综合网站免费| sis001欧美| 亚洲欧美日韩爽爽影院| 中文字幕国产在线观看| 久久影视一区二区| 日本黄色三级大片| 国产亚洲一区二区三区不卡| 人人做人人澡人人爽欧美| 日本黄在线观看| 91久久线看在观草草青青| 日本黄色特级片| 久久成人亚洲| 偷拍视频一区二区| 欧美天堂一区二区| 久久国产一区二区三区| 艳妇乳肉豪妇荡乳av| 成人免费小视频| 波多野结衣网页| 国内精品嫩模av私拍在线观看| 99精彩视频| 爱福利在线视频| 亚洲精品国产综合久久| 99超碰在线观看| 国产精品美女视频| 91亚洲一区二区| 亚洲国产二区| 日韩久久不卡| 国产精品久久久久久av公交车| 久久99精品国产99久久6尤物| 亚洲精品视频网| 欧美日韩午夜剧场| 日本一二三不卡视频| 激情欧美一区二区三区在线观看| 亚洲一区二区三区免费观看| 成人福利一区二区| 欧美国产第二页| 深夜福利在线看| 欧美人妇做爰xxxⅹ性高电影| 欧美精品xxxxx| 久久一区二区三区国产精品| 在线黄色免费观看| 亚洲午夜一区| 色综合影院在线观看| 国产原创一区| 韩国三级电影久久久久久| 国产尤物视频在线| 日韩亚洲欧美综合| 日本视频免费观看| 亚洲男同性恋视频| 久操视频免费看| 国产一区二区福利| 久草综合在线观看| 国产精品啊啊啊| 日韩高清dvd| 9l视频自拍蝌蚪9l视频成人| 日本最新高清不卡中文字幕| 黄色网在线免费观看| 日韩激情在线视频| 99热这里只有精品66| 色哟哟一区二区三区| 免费在线观看一级片| 国产日本欧洲亚洲| 国产原创剧情av| 国产一区二区三区美女| 可以在线看的黄色网址| 欧美日韩国产欧| 亚洲精美视频| 亚洲精品国模| 国产精品10p综合二区| 久久精品超碰| 国产成人精品av| av老司机在线观看| 久久久91精品国产| 成a人片在线观看www视频| 亚洲第一视频网站| 99在线观看免费| 欧美片网站yy| 懂色av蜜臀av粉嫩av喷吹 | 这里只有精品免费视频| 亚洲国产成人高清精品| 亚洲精品久久久久久国| 国产亚洲精品中文字幕| 好吊一区二区三区视频| 国产91精品一区二区麻豆网站| 天堂av8在线| 日本视频在线一区| 日韩精品无码一区二区三区免费| 在线播放日韩| 国产 国语对白 露脸| 99re6这里只有精品| 日本免费一区二区三区| 欧美日韩爱爱| 欧美成人第一区| 亚洲日本三级| 欧美日韩免费精品| 亚洲人和日本人hd| 欧美精品久久久| 免费观看久久av| 欧美精品一区二区三区在线看午夜| 99这里只有精品视频| 国产成人精品免费视频大全最热 | 国产在线免费看| 国产精品网站导航| av片在线免费看| 国产精品福利影院| 日韩在线视频网址| 亚洲精品一二三| 欧美成人精品欧美一级私黄| 亚洲免费视频中文字幕| 免费人成年激情视频在线观看| 一卡二卡欧美日韩| 日本亚洲欧美在线| 黄色精品在线看| av片免费观看| 欧美日本一道本| a毛片在线免费观看| 日韩一区二区三区在线观看| 亚洲国产综合网| 日韩av在线网站| 黄色免费在线播放| 俺去了亚洲欧美日韩| 在线你懂的视频| 97久久伊人激情网| 成人激情综合| 91在线观看免费观看| 91精品国产自产在线丝袜啪| 国产欧美日韩综合精品二区| 亚洲成aⅴ人片久久青草影院| 欧美人与性禽动交精品| 久久国产成人精品| 久操手机在线视频| 欧美亚洲自偷自偷| 91亚洲精品久久久蜜桃借种| 国产成人精品免费在线| 在线观看av中文字幕| 国产欧美日韩在线看| 青青青在线免费观看| 一区二区三区中文在线观看| 国产一级在线免费观看| 色综合天天综合在线视频| 在线观看日批视频| 精品国精品自拍自在线| 国产中文字幕在线播放| 欧美刺激性大交免费视频| 黄色aa久久| 国产精品网红直播| 国产精品玖玖玖在线资源| 神马影院我不卡| 国内精品久久久久久久影视麻豆 | 精品国产第一福利网站| 国产欧美日韩专区发布| 欧美a级网站| 伊人久久av导航| 国产亚洲综合精品| 日韩a一级欧美一级| 97久久精品人人做人人爽50路| 夫妇露脸对白88av| 欧美日韩裸体免费视频| 国产精品丝袜黑色高跟鞋| 亚洲精品动漫100p| 国产在线更新| 国产不卡在线观看| 国产精品毛片av| 福利在线小视频| 热久久国产精品| 五月天激情小说| 亚洲精品日产精品乱码不卡| 无码任你躁久久久久久久| 欧美成人一区二区三区| 色网站免费在线观看| 日本三级久久久| 韩国女主播一区二区三区| www亚洲国产| 青青草成人在线观看| 欧美黑人欧美精品刺激| 亚洲国产欧美日韩另类综合 | 久久r热视频| 国产精品一码二码三码在线| 97视频热人人精品免费| av五月天在线| 久久久久久影视| 亚洲精品国产精品乱码| 欧美v亚洲v综合ⅴ国产v| 欧美精品hd| 国产精品福利观看| 欧美人与物videos另类xxxxx| 欧美亚洲精品一区二区| 国产成人精品免费| 久久久久久福利| 欧美一级欧美三级| av片在线观看免费| 91色视频在线观看| 一级欧洲+日本+国产| 国产性生活一级片| 亚洲精品中文在线影院| 国产黄色片免费| 久久久精品999| 999久久久国产999久久久| 夜夜爽www精品| 精久久久久久久久久久| 美国一级片在线观看| 欧美日韩国产免费| 欧美jizzhd69巨大| 成人黄色生活片| 亚洲国产一区二区在线观看| 亚洲一二三av| 伊人性伊人情综合网| 亚洲国产剧情在线观看| 欧美激情一区二区三区成人 | 欧美性理论片在线观看片免费| 久久精品一二三区| 首页欧美精品中文字幕| 亚洲国产av一区| 欧美日韩高清一区二区不卡| 国产激情小视频在线| 成人av电影免费| 亚洲人人精品| 日本少妇高潮喷水xxxxxxx| 色噜噜狠狠色综合中国| 1pondo在线播放免费| 亚洲一区二区三区sesese| 欧美日本三区| avtt香蕉久久| 欧美午夜理伦三级在线观看| 日本激情在线观看| 成人免费在线一区二区三区| 亚洲精品1区2区| 69精品无码成人久久久久久| 欧美日韩精品电影| 久久五月精品中文字幕| 久久久久久久久一区| 日本va欧美va精品发布| 欧美交换国产一区内射| 国产视频在线一区二区| 懂色aⅴ精品一区二区三区| japanese在线播放| 26uuu久久天堂性欧美| 中文字幕在线网址| 欧美激情国产日韩精品一区18| 日韩精品社区| 亚洲欧美手机在线| 欧美日韩免费一区| 视频三区在线| 久久99精品久久久久子伦 | 久久久午夜精品福利内容| 在线观看www91| 欧美人体视频xxxxx| 欧美一卡2卡3卡4卡无卡免费观看水多多 | 亚洲视频在线观看免费视频| 欧美激情在线视频二区| 欧美码中文字幕在线| 国产原创剧情av| 欧美老年两性高潮| 悠悠资源网亚洲青| 佐佐木明希av| 国产欧美日韩卡一| 特级丰满少妇一级aaaa爱毛片|