加群联系作者vx:xiaoda0423
仓库地址:webvueblog.github.io/JavaPlusDoc...
webvueblog.github.io/JavaPlusDoc...
✅ 各字段说明及是否可改
字段名 | 说明 | 是否可修改 | 修改建议 |
---|---|---|---|
modelVersion |
Maven POM 的版本,目前固定为 4.0.0 ,不能改为其他 |
❌ 不建议改 | |
groupId |
项目组 ID,通常代表公司或组织域名反写,如 com.mycompany.project |
✅ 可以改 | 建议与组织、项目命名一致 |
artifactId |
工件 ID,即模块名,构成 jar 包名 | ✅ 可以改 | 命名清晰、唯一性强 |
version |
当前项目版本 | ✅ 可以改 | 生产建议使用正式版本如 1.0.0 |
packaging |
打包方式,pom 表示父模块(非代码模块) |
✅ 可以改 | 需与实际用途匹配 |
✅ 示例:将你的父项目改为你公司项目结构
假设你公司叫做 example.com
,你正在开发一个验证码服务,准备正式发布。
xml
<!-- Maven项目定义 -->
<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">
<!-- 模型版本:固定为4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织或公司名称 -->
<groupId>com.example.captcha</groupId>
<!-- 模块名称:验证码父模块 -->
<artifactId>captcha-parent</artifactId>
<!-- 版本号:即将发布正式版 -->
<version>1.0.0</version>
<!-- 打包类型:父项目用pom -->
<packaging>pom</packaging>
✅ 子模块中引用方式
例如 core/captcha-spring-boot-starter/pom.xml
:
xml
<parent>
<groupId>com.example.captcha</groupId>
<artifactId>captcha-parent</artifactId>
<version>1.0.0</version>
</parent>
✅ 常见组合建议(命名规范)
类型 | 建议命名 |
---|---|
公司 | com.example |
项目 | captcha |
父模块 | captcha-parent |
Starter模块 | captcha-spring-boot-starter |
Core模块 | captcha-core |
Web模块 | captcha-web 或 captcha-service |
✅ 特别注意
- 如果你只改了
groupId
或artifactId
,需要 同步修改子模块引用的<parent>
块,否则会构建失败。 - 如果你准备上传到公司私有 Nexus 仓库,建议 version 使用正式版如:
1.0.0
、1.0.1-RELEASE
等,而不是SNAPSHOT
。
✅ 各字段说明及是否可改
字段名 | 说明 | 是否可修改 | 修改建议 |
---|---|---|---|
modelVersion |
Maven POM 的版本,目前固定为 4.0.0 ,不能改为其他 |
❌ 不建议改 | |
groupId |
项目组 ID,通常代表公司或组织域名反写,如 com.mycompany.project |
✅ 可以改 | 建议与组织、项目命名一致 |
artifactId |
工件 ID,即模块名,构成 jar 包名 | ✅ 可以改 | 命名清晰、唯一性强 |
version |
当前项目版本 | ✅ 可以改 | 生产建议使用正式版本如 1.0.0 |
packaging |
打包方式,pom 表示父模块(非代码模块) |
✅ 可以改 | 需与实际用途匹配 |
✅ 示例:将你的父项目改为你公司项目结构
假设你公司叫做 example.com
,你正在开发一个验证码服务,准备正式发布。
xml
<!-- Maven项目定义 -->
<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">
<!-- 模型版本:固定为4.0.0 -->
<modelVersion>4.0.0</modelVersion>
<!-- 组织或公司名称 -->
<groupId>com.example.captcha</groupId>
<!-- 模块名称:验证码父模块 -->
<artifactId>captcha-parent</artifactId>
<!-- 版本号:即将发布正式版 -->
<version>1.0.0</version>
<!-- 打包类型:父项目用pom -->
<packaging>pom</packaging>
✅ 子模块中引用方式
例如 core/captcha-spring-boot-starter/pom.xml
:
xml
<parent>
<groupId>com.example.captcha</groupId>
<artifactId>captcha-parent</artifactId>
<version>1.0.0</version>
</parent>
✅ 常见组合建议(命名规范)
类型 | 建议命名 |
---|---|
公司 | com.example |
项目 | captcha |
父模块 | captcha-parent |
Starter模块 | captcha-spring-boot-starter |
Core模块 | captcha-core |
Web模块 | captcha-web 或 captcha-service |
✅ 特别注意
- 如果你只改了
groupId
或artifactId
,需要 同步修改子模块引用的<parent>
块,否则会构建失败。 - 如果你准备上传到公司私有 Nexus 仓库,建议 version 使用正式版如:
1.0.0
、1.0.1-RELEASE
等,而不是SNAPSHOT
。
typescript
package com.anji.captcha.storage.impl;
import com.anji.captcha.core.service.CaptchaCacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.concurrent.TimeUnit;
public class RedisCacheServiceImpl implements CaptchaCacheService {
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public void set(String key, String value, long expiresInSeconds) {
redisTemplate.opsForValue().set(key, value, expiresInSeconds, TimeUnit.SECONDS);
}
@Override
public String get(String key) {
return redisTemplate.opsForValue().get(key);
}
@Override
public void delete(String key) {
redisTemplate.delete(key);
}
}
java
package com.anji.captcha.storage.impl;
import com.anji.captcha.core.service.CaptchaCacheService;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class LocalCacheServiceImpl implements CaptchaCacheService {
private final Map<String, CacheValue> CACHE_MAP = new ConcurrentHashMap<>();
@Override
public void set(String key, String value, long expiresInSeconds) {
long expireTime = System.currentTimeMillis() + expiresInSeconds * 1000;
CACHE_MAP.put(key, new CacheValue(value, expireTime));
}
@Override
public String get(String key) {
CacheValue cacheValue = CACHE_MAP.get(key);
if (cacheValue == null) {
return null;
}
if (cacheValue.isExpired()) {
CACHE_MAP.remove(key);
return null;
}
return cacheValue.getValue();
}
@Override
public void delete(String key) {
CACHE_MAP.remove(key);
}
private static class CacheValue {
private final String value;
private final long expireTime;
public CacheValue(String value, long expireTime) {
this.value = value;
this.expireTime = expireTime;
}
public String getValue() {
return value;
}
public boolean isExpired() {
return System.currentTimeMillis() > expireTime;
}
}
}
typescript
package com.anji.captcha.core.util;
public class StringUtils {
public static boolean isBlank(String str) {
return str == null || str.trim().isEmpty();
}
public static boolean isNotBlank(String str) {
return !isBlank(str);
}
public static String trim(String str) {
return str == null ? null : str.trim();
}
}
java
package com.anji.captcha.core.service.impl;
import com.anji.captcha.core.model.common.ResponseModel;
import com.anji.captcha.core.model.vo.CaptchaVO;
import com.anji.captcha.core.service.CaptchaCacheService;
import com.anji.captcha.core.service.CaptchaService;
import java.util.Properties;
import java.util.UUID;
public class DefaultCaptchaServiceImpl implements CaptchaService {
private final Properties config;
private final CaptchaCacheService captchaCacheService;
public DefaultCaptchaServiceImpl(Properties config) {
this.config = config;
this.captchaCacheService = CaptchaServiceFactory.getCache(config.getProperty("captcha.cache.type", "local"));
}
@Override
public ResponseModel get(CaptchaVO captchaVO) {
// 生成验证码
String captchaId = UUID.randomUUID().toString();
String token = UUID.randomUUID().toString();
// 缓存验证码
captchaCacheService.set(captchaId, token, 300);
// 返回验证码信息
CaptchaVO respVO = new CaptchaVO();
respVO.setCaptchaId(captchaId);
respVO.setToken(token);
return ResponseModel.success(respVO);
}
@Override
public ResponseModel check(CaptchaVO captchaVO) {
// 校验验证码
String token = captchaCacheService.get(captchaVO.getCaptchaId());
if (token == null) {
return ResponseModel.error("9999", "验证码已失效");
}
if (token.equals(captchaVO.getToken())) {
// 验证通过,删除缓存
captchaCacheService.delete(captchaVO.getCaptchaId());
return ResponseModel.success();
} else {
return ResponseModel.error("9999", "验证码错误");
}
}
}
java
package com.anji.captcha.core.service.impl;
import com.anji.captcha.core.service.CaptchaCacheService;
import com.anji.captcha.core.service.CaptchaService;
import com.anji.captcha.storage.impl.LocalCacheServiceImpl;
import com.anji.captcha.storage.impl.RedisCacheServiceImpl;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class CaptchaServiceFactory {
private static final Map<String, CaptchaService> instances = new HashMap<>();
private static final Map<String, CaptchaCacheService> cacheInstances = new HashMap<>();
public static CaptchaService getInstance(Properties config) {
String captchaType = config.getProperty("captcha.type", "default");
if (!instances.containsKey(captchaType)) {
synchronized (CaptchaServiceFactory.class) {
if (!instances.containsKey(captchaType)) {
// 根据类型创建不同的验证码服务实现
CaptchaService instance = new DefaultCaptchaServiceImpl(config);
instances.put(captchaType, instance);
}
}
}
return instances.get(captchaType);
}
public static CaptchaCacheService getCache(String cacheType) {
if (!cacheInstances.containsKey(cacheType)) {
synchronized (CaptchaServiceFactory.class) {
if (!cacheInstances.containsKey(cacheType)) {
// 根据类型创建不同的缓存服务实现
CaptchaCacheService instance;
if ("redis".equalsIgnoreCase(cacheType)) {
instance = new RedisCacheServiceImpl();
} else {
instance = new LocalCacheServiceImpl();
}
cacheInstances.put(cacheType, instance);
}
}
}
return cacheInstances.get(cacheType);
}
}
xml
<?xml version="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 http://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>2.3.5.RELEASE</version>
</parent>
<groupId>com.anji</groupId>
<artifactId>captcha-service</artifactId>
<version>1.0.0</version>
<name>captcha-service</name>
<description>验证码服务单体应用</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot 配置处理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Redis 支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<optional>true</optional>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
项目概述
验证码服务项目,提供滑动拼图、点选文字等多种验证码类型。项目采用模块化设计,主要包含核心模块和多种集成方式。
项目结构
项目主要分为以下几个部分:
1. 核心模块
1.1 captcha 模块
- 路径:
core/captcha
- 版本:1.3.1
- 功能:提供验证码的核心实现
- 依赖:仅依赖 SLF4J API
1.2 captcha-spring-boot-starter 模块
- 路径:
core/captcha-spring-boot-starter
- 版本:1.3.1
- 功能:Spring Boot 自动配置,简化验证码集成
- 主要类:
AjCaptchaAutoConfiguration
:主配置类AjCaptchaServiceAutoConfiguration
:服务配置AjCaptchaStorageAutoConfiguration
:存储配置CaptchaController
:提供验证码接口AjCaptchaProperties
:配置属性类
2. 服务模块
2.1 springboot 服务
- 路径:
service/springboot
- 功能:基于 Spring Boot 的验证码服务实现
2.2 springmvc 服务
- 路径:
service/springmvc
- 功能:基于 Spring MVC 的验证码服务实现
后端项目搭建步骤
1. 基于 Spring Boot 搭建
-
创建 Spring Boot 项目
- 使用 Spring Initializr 或 IDE 创建项目
- 添加 Web 依赖
-
添加验证码依赖
xml<dependency> <groupId>com.anji-plus</groupId> <artifactId>spring-boot-starter-captcha</artifactId> <version>1.3.1</version> </dependency>
-
配置验证码属性 在
application.properties
或application.yml
中添加:yamlaj: captcha: # 验证码类型:默认(default)、滑动拼图(blockPuzzle)、点选文字(clickWord) type: blockPuzzle # 水印设置 water-mark: 水印文字 # 水印字体 water-font: WenQuanZhengHei.ttf # 字体类型 font-type: WenQuanZhengHei.ttf # 缓存类型:local/redis cache-type: local
-
使用验证码接口 项目自动注册了以下接口:
/captcha/get
:获取验证码/captcha/check
:验证验证码
2. 基于 Spring MVC 搭建
-
创建 Spring MVC 项目
-
添加验证码核心依赖
xml<dependency> <groupId>com.anji-plus</groupId> <artifactId>captcha</artifactId> <version>1.3.1</version> </dependency>
-
手动配置验证码服务 需要手动配置
CaptchaService
和相关组件
3. 基于 Go 搭建
参考 service/go
目录下的实现,包含:
- 配置管理
- 常量定义
- 模型定义
- 服务实现
- 工具类
核心功能说明
-
验证码类型
- 滑动拼图(blockPuzzle)
- 点选文字(clickWord)
-
存储方式
- 本地缓存(local)
- Redis 缓存(redis)
-
主要接口
- 获取验证码:生成验证码图片和校验信息
- 校验验证码:验证用户输入是否正确
-
配置选项
-
水印设置
-
字体设置
-
缓存类型
-
干扰选项
-
请求频率限制
-
我发现项目中有一个名为captcha-spring-boot-starter的目录,这很可能就是用户在寻找的spring-boot-starter-captcha。我将查看该目录下的pom.xml文件以确认。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\pom.xml
我已经找到了spring-boot-starter-captcha,它位于core/captcha-spring-boot-starter目录下。我将继续查看该目录下的src目录结构,以便提供更详细的信息。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src
我需要查看src目录的结构,因为它是一个目录而不是文件。
toolName: view_folder
status: success
c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src
继续深入查看src目录的结构,特别是Java代码部分。
toolName: view_folder
status: success
c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com
我还需要查看resources目录,了解配置文件等内容。
toolName: view_folder
status: success
c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\resources
我需要查看spring.factories文件,这是Spring Boot自动配置的关键文件。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\resources\META-INF\spring.factories
我需要查看自动配置类AjCaptchaAutoConfiguration,了解它的功能和配置方式。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\config\AjCaptchaAutoConfiguration.java
我需要查看AjCaptchaProperties类,了解可配置的属性。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\properties\AjCaptchaProperties.java
我需要查看CaptchaController类,了解如何使用这个验证码组件。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\controller\CaptchaController.java
我需要查看AjCaptchaServiceAutoConfiguration类,了解服务配置。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\config\AjCaptchaServiceAutoConfiguration.java
我需要查看AjCaptchaStorageAutoConfiguration类,了解存储配置。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha-spring-boot-starter\src\main\java\com\anji\captcha\config\AjCaptchaStorageAutoConfiguration.java
我需要查看项目的主pom.xml文件,了解整个项目的结构和依赖关系。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\pom.xml
我需要查看captcha核心模块的pom.xml文件,了解核心功能的依赖关系。
toolName: view_files
status: success
filePath: c:\Users\23979\Downloads\captcha\core\captcha\pom.xml
spring-boot-starter-captcha位于项目的core/captcha-spring-boot-starter目录下。这是一个Spring Boot的自动配置模块,用于简化验证码功能的集成。
具体结构如下:
-
位置 :
core/captcha-spring-boot-starter
-
主要文件:
pom.xml
:定义了模块的Maven配置,artifactId为"spring-boot-starter-captcha",版本为1.3.1src/main/java/com/anji/captcha/
:包含了自动配置的Java代码src/main/resources/META-INF/spring.factories
:Spring Boot自动配置的入口文件
-
核心类:
AjCaptchaAutoConfiguration
:主要的自动配置类AjCaptchaServiceAutoConfiguration
:验证码服务的自动配置AjCaptchaStorageAutoConfiguration
:验证码存储的自动配置CaptchaController
:提供验证码接口的控制器AjCaptchaProperties
:验证码配置属性类
-
功能:
- 提供了验证码的自动配置功能
- 支持滑动拼图、点选文字等多种验证码类型
- 提供了验证码获取和验证的REST接口
- 支持本地缓存和Redis缓存两种存储方式
-
依赖关系:
- 依赖于core/captcha模块,这是验证码的核心实现
- 依赖Spring Boot Web和自动配置相关组件
这个starter模块使得在Spring Boot项目中集成验证码功能变得非常简单,只需要添加依赖并进行少量配置即可使用。