在后台管理系统、数据采集任务中,经常会遇到验证码拦截自动化操作。为了解决这个问题,我们可以使用 Java 构建一个轻量级的验证码识别微服务,供多个应用调用,从而实现验证码的自动化识别。
一、技术选型 Java 17:现代 Java 开发环境,支持更强的性能优化。
Spring Boot:构建微服务框架,方便快速启动 HTTP 服务。
Tess4J:Tesseract OCR 的 Java 封装,用于图像文字识别。
Maven:依赖管理和构建工具。
二、项目结构概览
captcha-ocr-service/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com.example.ocr/ │ │ ├── CaptchaController.java │ │ ├── CaptchaService.java │ │ └── ImageUtils.java │ └── resources/ │ └── application.yml └── pom.xml 三、核心功能实现
- ImageUtils.java:图像处理
public class ImageUtils { public static BufferedImage preprocess(BufferedImage image) { BufferedImage gray = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY); Graphics2D g = gray.createGraphics(); g.drawImage(image, 0, 0, null); g.dispose(); return gray; } } 2. CaptchaService.java:验证码识别逻辑
@Service public class CaptchaService { public String recognize(BufferedImage image) throws TesseractException { ITesseract tesseract = new Tesseract(); tesseract.setDatapath("tessdata"); // 放置 tessdata 文件夹的位置 tesseract.setLanguage("eng"); tesseract.setPageSegMode(7); tesseract.setTessVariable("tessedit_char_whitelist", "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); return tesseract.doOCR(ImageUtils.preprocess(image)).replaceAll("\\s+", ""); } } 3. CaptchaController.java:上传接口
@RestController @RequestMapping("/api/ocr") public class CaptchaController {
@Autowired
private CaptchaService captchaService;
@PostMapping("/captcha")
public ResponseEntity<String> recognizeCaptcha(@RequestParam("file") MultipartFile file) throws IOException, TesseractException {
BufferedImage image = ImageIO.read(file.getInputStream());
String result = captchaService.recognize(image);
return ResponseEntity.ok(result);
}
} 四、配置文件 application.yml
server: port: 8081 spring: servlet: multipart: max-file-size: 2MB max-request-size: 2MB 五、运行项目 启动 Spring Boot 项目
使用 curl 或 Postman 测试上传图片:
curl -F "file=@captcha.png" http://localhost:8081/api/ocr/captcha 六、进一步优化 部署为 Docker 容器,方便在各个环境中运行
增加日志与错误处理逻辑
添加缓存机制避免重复识别同一图像
为特定验证码场景训练自定义 Tesseract 模型