当前位置: 首页 > article >正文

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

为了生成唯一的短链接,我们可以利用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的实体类,用于映射数据库中的表:

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 Setters

    public 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接口来处理数据库操作:

import org.springframework.data.jpa.repository.JpaRepository;

public interface ShortLinkRepository extends JpaRepository<ShortLink, Long> {
    ShortLink findByShortCode(String shortCode);
    boolean existsByShortCode(String shortCode);
}

4. 创建Service

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

@Service
public class ShortLinkService {

    @Autowired
    private 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请求:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class ShortLinkController {

    @Autowired
    private 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应用:

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.kler.cn/a/504337.html

相关文章:

  • ElasticSearch|ES|架构介绍|原理浅析
  • python学opencv|读取图像(三十一)缩放图像的三种方法
  • mapbox进阶,添加绘图控件
  • PyQt5
  • 20250112面试鸭特训营第20天
  • Windows核心编程—匿名管道双向通信
  • 如何学好数据结构?
  • 大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建二
  • 如何备考PostgreSQL中级认证
  • 统计有序矩阵中的负数
  • STM32第6章、WWDG
  • linux stdout/stderr重定向到文件,>或tee
  • 小结:华为交换机常用的操作指令
  • 43.Textbox的数据绑定 C#例子 WPF例子
  • Spring MVC复杂数据绑定-绑定数组
  • 13:00面试,13:08就出来了,问的问题有点变态。。。
  • 2025最新JAVA面试八股文【基础篇】
  • Rk3568 Andorid 11 新增adb检测,只有使用客户私钥的设备才能链接adb
  • 集中式架构vs分布式架构
  • 【硕博研究生国际会议推荐(可线上)】方向涵盖电子信息、人工智能、能源利用、自动化、数据处理、信息化经济、管理、智慧城市、公共交通、计算机视觉...
  • 数据结构和算法-07平衡二叉树-01
  • 《拉依达的嵌入式\驱动面试宝典》—Linux篇(六)_Linux驱动编程
  • pytest-instafail:让测试失败信息即时反馈
  • 【PyQt】通过load ui来实现菜单栏
  • burpsiute的基础使用(2)
  • 如何通过高防服务隐藏服务器源IP