🗣 SL提问: springboot短链接
✍️ Ai批改: Spring Boot 短链接服务实现
短链接服务可以将长URL转换为短URL,便于分享和传播。下面介绍如何在Spring Boot中实现短链接功能。
核心实现方案
1、数据库设计
sql
CREATE TABLE short_url (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
short_code VARCHAR(10) UNIQUE,
original_url VARCHAR(2048) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP NULL,
access_count INT DEFAULT 0
);
2、基础实现代码
控制器层
java
@RestController
@RequestMapping(/api/short-url)
public class ShortUrlController {
@Autowired
private ShortUrlService shortUrlService;
@PostMapping
public ResponseEntity<ShortUrlResponse createShortUrl(@RequestBody ShortUrlRequest request) {
ShortUrlResponse response = shortUrlService.createShortUrl(request);
return ResponseEntity.ok(response);
}
@GetMapping(/{shortCode})
public ResponseEntity<Void redirect(@PathVariable String shortCode) {
String originalUrl = shortUrlService.getOriginalUrl(shortCode);
return ResponseEntity.status(HttpStatus.FOUND)
.location(URI.create(originalUrl))
.build();
}
}
服务层
java
@Service
public class ShortUrlService {
@Autowired
private ShortUrlRepository repository;
public ShortUrlResponse createShortUrl(ShortUrlRequest request) {
// 生成短码
String shortCode = generateShortCode(request.getUrl());
ShortUrl shortUrl = new ShortUrl();
shortUrl.setOriginalUrl(request.getUrl());
shortUrl.setShortCode(shortCode);
// 设置过期时间
if (request.getExpireDays() != null) {
shortUrl.setExpiresAt(LocalDateTime.now().plusDays(request.getExpireDays()));
}
repository.save(shortUrl);
return new ShortUrlResponse(shortCode, request.getUrl());
}
public String getOriginalUrl(String shortCode) {
ShortUrl shortUrl = repository.findByShortCode(shortCode)
.orElseThrow(() new ResourceNotFoundException(Short URL not found));
// 检查是否过期
if (shortUrl.getExpiresAt() != null && shortUrl.getExpiresAt().isBefore(LocalDateTime.now())) {
throw new ResourceExpiredException(Short URL has expired);
}
// 更新访问计数
shortUrl.setAccessCount(shortUrl.getAccessCount() + 1);
repository.save(shortUrl);
return shortUrl.getOriginalUrl();
}
private String generateShortCode(String url) {
// 实现短码生成逻辑
// 可以使用哈希算法+Base62编码
}
}
3、短码生成算法
java
private String generateShortCode(String url) {
// 1、计算URL的哈希值
String hash = DigestUtils.md5DigestAsHex(url.getBytes());
// 2、取哈希值前8个字符作为短码
String shortHash = hash.substring(0, 8);
// 3、转换为Base62编码
return Base62.encode(shortHash);
}
高级功能扩展
1、自定义短码:允许用户指定自定义短码
2、访问统计:记录访问时间、IP、设备等信息
3、过期时间:支持设置链接有效期
4、API限流:防止滥用短链接生成
5、黑名单:禁止某些域名的URL生成短链接
6、缓存优化:使用Redis缓存热门短链接
性能优化建议
1、使用布隆过滤器快速判断短码是否存在
2、批量生成短码减少数据库交互
3、实现本地缓存减少数据库查询
4、使用异步方式记录访问日志
完整项目结构
src/main/java/com/example/shorturl/
├── config/ 配置类
├── controller/ 控制器
├── dto/ 数据传输对象
├── exception/ 自定义异常
├── model/ 数据模型
├── repository/ 数据访问层
├── service/ 业务逻辑层
├── util/ 工具类
└── ShortUrlApplication.java
以上是Spring Boot实现短链接服务的基本框架,可以根据实际需求进行扩展和优化。
0
IP地址: 23.114.247.129
搜索次数: 11
提问时间: 2025-07-13 14:12:42
❓️ 热门提问:
ai写作批改作文
楼房评估价是什么意思
上海 黄金交易
金手镯戴在哪个手上最合适呢
伦敦金交易额
上海黄金交易所金价今日实时行情
16克的金手镯要多少钱
外汇收据
黄金的几大品牌大全
打金戒指一般会损耗多少
豌豆Ai站群搜索引擎系统
🤝 关于我们:
三乐Ai
作文批改
英语分析
在线翻译
拍照识图
Ai提问
英语培训
本站流量
联系我们
📢 温馨提示:本站所有问答由Ai自动创作,内容仅供参考,若有误差请用“联系”里面信息通知我们人工修改或删除。
👉 技术支持:本站由豌豆Ai提供技术支持,使用的最新版:《豌豆Ai站群搜索引擎系统 V.25.05.20》搭建本站。