w w w . w d . c h a t
🗣 Wd提问
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/shorturl)
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地址 26.83.87.185
🔍
搜索次数 16
提问时间 2025-06-04 07:07:28

📣 商家广告

单字符域名

单字符域名

月饼

月饼

贵阳用友软件

贵阳用友软件

🛒 域名购买

热门提问

🌐 域名评估

最新挖掘

🖌 热门作画

🤝 关于我们

🗨 加入群聊
💬选择任意群聊,与同好交流分享

🔗 友情链接

🧰

站长工具

📢

温馨提示

本站所有 ❓️ 问答 由Ai自动创作,内容仅供参考,若有误差请用"联系"里面信息通知我们人工修改或删除。

👉

技术支持

本站由 🟢 豌豆Ai 提供技术支持,使用的最新版: 《豌豆Ai站群搜索引擎系统 V.25.10.25》 搭建本站。

上一篇 350746 350747 350748 下一篇