SpringBoot+Tika实现数据泄露防护、检测敏感信息功能全流程代码讲解
本文主要介绍了如何使用 Spring Boot 和 Apache Tika 实现数据泄露防护和敏感信息检测功能。
🚨【阿里云限时特惠】云产品低至38元/年起!🎉
各位技术伙伴,阿里云爆款钜惠来袭!立即抢购:阿里云特惠 💰
🔥 新人专享特惠
-
200M带宽云服务器
38元/年起(官网价¥459元/年),立省421元!
✔️ 适用场景:网站搭建/Web应用/电商独立站 -
经济型e实例
续费99元/年| 2核2G + 3M带宽 + 40G ESSD云盘
✔️ 含防病毒版安全防护(防勒索/挖矿/木马)
✔️ 限新用户,每人限购1台
🤖 AI大模型特惠
-
DeepSeek R1大模型
首年99元起| 1.5B/7B参数规格
✔️ 支持宝塔面板一键部署
✔️ 数学/代码/推理任务表现出色 -
企业知识库应用
数据库+文件存储+多端支持
✔️ 低代码扩展 + 钉钉/企微/微信集成
Tika介绍
Apache Tika 是一个功能强大的内容分析工具,具有以下特点:
- 支持多种文件格式,包括办公文档、PDF、HTML、XML、文本文件、图片、音视频、电子邮件和压缩文件等。
- 能自动检测文件类型,根据文件内容而非扩展名判断文件的真实类型,并识别 MIME 类型。
- 能提取文本和元数据,如作者、创建日期、修改日期、文件大小、版权信息等。
- 支持 OCR,可从扫描图像或 PDF 文档中的图片提取文本信息。
- 具备自动检测文件文本语言的功能。
- 可嵌入到其他 Java 应用中,提供 Java API,也可作为独立应用使用,如命令行工具 Tika App 和基于 RESTful API 的 Tika Server。
- 支持多线程处理,可提高大批量文件处理速度。
- 返回统一的 JSON 或 XML 格式输出,便于与其他系统集成。
- 支持处理大型文档和多页文档。
- 可与其他工具和库集成,如 Lucene、Solr、Elasticsearch、Apache POI、PDFBox 和 Tesseract OCR 等。
- 具有高度可扩展性,用户可根据需求自定义解析器、增加新文件格式支持或调整文本提取策略。
Tika 的架构组件,包括 Tika Core、Tika Parsers、Tika Config、Tika App、Tika Server、Tika Language Detection、Tika Extractor、Tika Metadata 和 Tika OCR 等。
在应用场景方面,Tika 可广泛应用于企业文档管理系统、内容管理系统(CMS)、数据分析与大数据平台、法律与合规性审查、数字资产管理(DAM)、信息安全与数据泄露防护以及自动化电子邮件分类等领域。
文章重点讲解了如何在 Spring Boot 中集成 Apache Tika 用于敏感信息识别和数据泄露防护。通过在文件上传时提取文件内容,并在提取的文本中搜索潜在的敏感数据(如身份证号、信用卡信息、电话号码等),实现敏感信息检测和数据泄露防护。
完整代码
包含 Maven 依赖、配置文件、Controller 接口、Service 和测试用例等,每一行代码都添加了注释,确保完整且可直接使用。
Maven 依赖
在 pom.xml 文件中添加以下依赖:
<dependencies>
<!-- Spring Boot Web 依赖,用于创建 RESTful API -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Apache Tika Core 依赖,提供核心的文件解析和内容提取功能 -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-core</artifactId>
<version>2.6.0</version>
</dependency>
<!-- Apache Tika Parsers 依赖,提供各种文件格式的解析器 -->
<dependency>
<groupId>org.apache.tika</groupId>
<artifactId>tika-parsers</artifactId>
<version>2.6.0</version>
</dependency>
</dependencies>
配置文件
创建 application.properties 配置文件(位于 src/main/resources 目录):
# 配置服务器端口
server.port=8080
# 配置文件上传限制(例如:最大文件大小为 10MB)
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
Service 层代码
创建 SensitiveInfoService.java 文件(位于 src/main/java/com/example/tikademo/service 目录):
package com.example.tikademo.service;
import org.apache.tika.Tika;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.sax.BodyContentHandler;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Service
public class SensitiveInfoService {
// 创建 Tika 实例,用于文件内容解析
private final Tika tika = new Tika();
// 定义正则表达式模式,用于检测身份证号、信用卡号和电话号码
private static final String ID_CARD_REGEX = "(\\d{17}[\\dXx]|\\d{15})"; // 身份证号正则表达式
private static final String CREDIT_CARD_REGEX = "(\\d{4}-?\\d{4}-?\\d{4}-?\\d{4})"; // 信用卡号正则表达式
private static final String PHONE_REGEX = "(\\d{3}-?\\d{3}-?\\d{4})|((\\d{11})|(\\d{3})\\d{7})"; // 电话号码正则表达式
/**
* 提取文件内容并检测敏感信息
*
* @param fileInputStream 文件输入流
* @return 检测结果字符串,包含检测到的敏感信息或提示未检测到敏感信息
* @throws IOException 如果读取文件内容时发生 I/O 错误
*/
public String checkSensitiveInfo(InputStream fileInputStream) throws IOException {
// 使用 Tika 提取文件内容
String fileContent = tika.parseToString(fileInputStream);
// 初始化 StringBuilder,用于构建检测结果
StringBuilder sensitiveInfoDetected = new StringBuilder();
// 检测身份证号
detectAndAppend(fileContent, ID_CARD_REGEX, "身份证号", sensitiveInfoDetected);
// 检测信用卡号
detectAndAppend(fileContent, CREDIT_CARD_REGEX, "信用卡号", sensitiveInfoDetected);
// 检测电话号码
detectAndAppend(fileContent, PHONE_REGEX, "电话号码", sensitiveInfoDetected);
// 返回检测结果,如果未检测到敏感信息,则返回相应提示
return sensitiveInfoDetected.length() > 0 ? sensitiveInfoDetected.toString() : "未检测到敏感信息";
}
/**
* 通用的敏感信息检测方法
*
* @param content 文件内容
* @param regex 正则表达式模式
* @param label 敏感信息标签(如身份证号、信用卡号等)
* @param result 用于存储检测结果的 StringBuilder
*/
private void detectAndAppend(String content, String regex, String label, StringBuilder result) {
// 编译正则表达式模式
Pattern pattern = Pattern.compile(regex);
// 创建 Matcher 对象,用于在文件内容中查找匹配项
Matcher matcher = pattern.matcher(content);
// 循环查找所有匹配项
while (matcher.find()) {
// 将检测到的敏感信息追加到结果中
result.append(label).append(": ").append(matcher.group()).append("\n");
}
}
}
Controller 层代码
创建 FileController.java 文件(位于 src/main/java/com/example/tikademo/controller 目录):
package com.example.tikademo.controller;
import com.example.tikademo.service.SensitiveInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
@RequestMapping("/api/files")
public class FileController {
// 注入 SensitiveInfoService 用于敏感信息检测
@Autowired
private SensitiveInfoService sensitiveInfoService;
/**
* 处理文件上传请求,并检测文件中的敏感信息
*
* @param file 上传的文件
* @return 检测结果字符串
*/
@PostMapping("/upload")
public String uploadFile(@RequestParam("file") MultipartFile file) {
try {
// 获取上传文件的输入流
String result = sensitiveInfoService.checkSensitiveInfo(file.getInputStream());
return result;
} catch (IOException e) {
// 如果发生 I/O 错误,返回错误信息
return "文件处理错误: " + e.getMessage();
}
}
}
前端页面
创建 index.html 文件(位于 src/main/resources/static 目录):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Upload File for Sensitive Information Detection</title>
</head>
<body>
<h2>Upload a File for Sensitive Information Detection</h2>
<!-- 创建文件上传表单,提交到 /api/files/upload 地址 -->
<form action="/api/files/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" required> <!-- 文件选择输入框 -->
<button type="submit">Upload</button> <!-- 上传按钮 -->
</form>
</body>
</html>
测试用例
创建测试文档 test.txt(内容如下),用于测试敏感信息检测功能:
复制
尊敬的用户:
您好!感谢您使用我们的服务。以下是您的账户信息:
身份证号:123456789012345678
信用卡号:1234-5678-9876-5432
电话号码:138-1234-5678
如果您对我们的服务有任何问题,请随时联系客户支持团队。
谢谢!
此致,
敬礼!
测试步骤
- 创建一个 Spring Boot 项目,并按照上述代码配置项目结构和文件。
- 将上述代码分别放入对应的文件中。
- 启动 Spring Boot 应用。
- 访问
http://localhost:8080页面,上传包含敏感信息的test.txt文件。 - 查看检测结果,应显示检测到的身份证号、信用卡号和电话号码等敏感信息。
上述代码完整且可直接使用,每一行代码都添加了详细的注释,方便理解和使用。
本文由博客一文多发平台 OpenWrite 发布!
共同学习,写下你的评论
评论加载中...
作者其他优质文章