springboot 根据UUID生成唯一的短链接

ops/2025/1/16 2:40:49/

为了生成唯一的短链接,我们可以利用UUID(通用唯一识别码)来确保每个短链接的唯一性。然后,我们将这个UUID进行Base62编码以缩短其长度。以下是完整的Spring Boot应用程序示例,展示了如何实现这一功能。

1. 添加依赖

首先,在你的pom.xml文件中添加必要的依赖项:

<dependencies><!-- Spring Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- H2 Database for simplicity --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency>
</dependencies>

2. 创建实体类

创建一个名为ShortLink的实体类,用于映射数据库中的表:

java">import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class ShortLink {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String originalUrl;private String shortCode;// Getters and Setterspublic Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getOriginalUrl() {return originalUrl;}public void setOriginalUrl(String originalUrl) {this.originalUrl = originalUrl;}public String getShortCode() {return shortCode;}public void setShortCode(String shortCode) {this.shortCode = shortCode;}
}

3. 创建Repository

创建一个JpaRepository接口来处理数据库操作:

java">import org.springframework.data.jpa.repository.JpaRepository;public interface ShortLinkRepository extends JpaRepository<ShortLink, Long> {ShortLink findByShortCode(String shortCode);boolean existsByShortCode(String shortCode);
}

4. 创建Service

创建一个服务类来处理业务逻辑:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.UUID;@Service
public class ShortLinkService {@Autowiredprivate ShortLinkRepository repository;public String generateShortLink(String originalUrl) {String shortCode = encodeUUIDToBase62(UUID.randomUUID());ShortLink link = new ShortLink();link.setOriginalUrl(originalUrl);link.setShortCode(shortCode);repository.save(link);return shortCode;}public String redirect(String shortCode) {ShortLink link = repository.findByShortCode(shortCode);if (link != null) {return link.getOriginalUrl();} else {throw new RuntimeException("Invalid URL");}}private String encodeUUIDToBase62(UUID uuid) {long mostSignificantBits = uuid.getMostSignificantBits();long leastSignificantBits = uuid.getLeastSignificantBits();StringBuilder base62String = new StringBuilder();base62String.append(encodeLongToBase62(mostSignificantBits));base62String.append(encodeLongToBase62(leastSignificantBits));return base62String.toString().substring(0, 8); // Take first 8 characters for shorter links}private static final String BASE62_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";private String encodeLongToBase62(long value) {StringBuilder base62String = new StringBuilder();do {int index = (int) (value % BASE62_CHARACTERS.length());base62String.insert(0, BASE62_CHARACTERS.charAt(index));value /= BASE62_CHARACTERS.length();} while (value > 0);return base62String.toString();}
}

5. 创建Controller

创建一个控制器来处理HTTP请求:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/api")
public class ShortLinkController {@Autowiredprivate ShortLinkService service;@PostMapping("/shorten")public String shorten(@RequestParam String url) {return service.generateShortLink(url);}@GetMapping("/{code}")public String redirectToOriginalUrl(@PathVariable String code) {return "redirect:" + service.redirect(code);}
}

6. 配置文件

最后,在application.properties中配置H2数据库:

# DataSource Configuration
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password# Hibernate Properties
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

完整项目结构

src/main/java/com/example/demo/
├── DemoApplication.java
├── controller/
│   └── ShortLinkController.java
├── entity/
│   └── ShortLink.java
├── repository/
│   └── ShortLinkRepository.java
└── service/└── ShortLinkService.java

主应用程序类

确保你有一个主应用程序类来启动Spring Boot应用:

java">package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

现在,你可以启动这个Spring Boot应用程序,并使用提供的API来生成短链接以及通过短链接重定向到原始URL。UUID结合Base62编码可以有效地生成唯一的、较短的短链接。


http://www.ppmy.cn/ops/150444.html

相关文章

开源安防软件ClamAV —— 筑梦之路

ClamAV&#xff08;Clam AntiVirus&#xff09;是一款开源的防病毒软件&#xff0c;广泛应用于网络安全领域&#xff0c;尤其在邮件网关和服务器环境中具有重要地位。以下是关于 ClamAV 的详细介绍&#xff1a; 1. ClamAV 的简介 ClamAV 由 Tomasz Kojm 于 2001 年创建&#…

详解 Docker 启动 Windows 容器第一篇:多种方式及实用配置指南

文章目录 前言1. 使用 Docker Compose 启动2. 使用 Docker CLI 启动3. 使用 Kubernetes 启动4. 兼容性说明5. 常见问题解答6. 高级配置总结 前言 在容器化技术中&#xff0c;Docker 允许我们在不同的平台上轻松运行各种操作系统&#xff0c;包括 Windows。本文将介绍如何通过 …

逐“绿”前行 企业综合能源管控低碳转型如何推进?

引言&#xff1a; 在“双碳”战略指引下&#xff0c;中国低碳节能各项工作有序推进&#xff0c;逐步建立起碳达峰碳中和“1N”的政策体系&#xff0c;重点领域、重点行业及各地区的碳达峰实施方案相继出台。能源对于促进经济社会发展、增进人民福祉至关重要。近年来&#xff0…

JavaScript系列(26)--安全编程实践详解

JavaScript安全编程实践详解 &#x1f512; 今天&#xff0c;让我们深入探讨JavaScript的安全编程实践。在当今的网络环境中&#xff0c;安全性已经成为开发者必须重点关注的领域。 安全编程基础 &#x1f31f; &#x1f4a1; 小知识&#xff1a;JavaScript安全编程涉及多个方…

OmniAudio-2.6B 简介与音频转文本实践

OmniAudio-2.6B 是一个基于 Transformer 的先进语音识别模型&#xff0c;具有强大的音频转文本能力。它利用大规模预训练和多语言支持&#xff0c;为离线和在线语音处理提供高精度的解决方案。 一、OmniAudio-2.6B 的原理 1. 核心技术 Transformer 架构&#xff1a;OmniAudio…

网络安全防护技术

一、网络基础知识 (1)TCP/IP协议 ◆传输控制协议困特网互联协议&#xff08; Transmission Control Protocol/Internet Protocol,TCPP)是目前因特网中使用最广泛的协议。 ◆目前因特网使用的是IPv4。IPv6是由互联网工程任务组&#xff08; Internet Engineering Task Force,I…

【大厂面试AI算法题中的知识点】方向涉及:ML/DL/CV/NLP/大数据...本篇介绍自动驾驶检测模型如何针对corner case 优化?

【大厂面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍自动驾驶检测模型如何针对corner case 优化&#xff1f; 【大厂面试AI算法题中的知识点】方向涉及&#xff1a;ML/DL/CV/NLP/大数据…本篇介绍自动驾驶检测模型如何针对corner case 优化&…

QML states和transitions的使用

一、介绍 1、states Qml states是指在Qml中定义的一组状态&#xff08;States&#xff09;&#xff0c;用于管理UI元素的状态转换和属性变化。每个状态都包含一组属性值的集合&#xff0c;并且可以在不同的状态间进行切换。 通过定义不同的状态&#xff0c;可以在不同的应用场…