欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot中縮短一個url鏈接的實現(xiàn)

 更新時間:2024年09月15日 10:30:23   作者:一只愛擼貓的程序猿  
縮短 URL 是現(xiàn)代應(yīng)用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享,URL 縮短服務(wù)的核心思路是將長 URL 映射到一個唯一的短代碼,本文主要介紹了springboot中縮短一個url鏈接的實現(xiàn),感興趣的可以了解一下

縮短 URL 是現(xiàn)代應(yīng)用程序中常見的需求,通常用于減少長 URL 的長度,使其更易于分享。URL 縮短服務(wù)的核心思路是將長 URL 映射到一個唯一的短代碼。較為復雜的場景可能涉及多種功能,例如:

  • 縮短的 URL 自動過期(即在一定時間后失效)。
  • 統(tǒng)計 URL 的訪問量。
  • 檢查并避免短 URL 重復。
  • 添加安全機制,如防止惡意鏈接。

場景案例

我們可以設(shè)計一個場景:

  • 用戶通過 API 提交長 URL。
  • 系統(tǒng)生成短 URL,短 URL 有有效期(例如 7 天),并存儲在數(shù)據(jù)庫中。
  • 用戶可以通過 API 查詢短 URL 的訪問次數(shù)。
  • 每當有人訪問短 URL,系統(tǒng)會記錄訪問量,并自動重定向到原始的長 URL。
  • 在短 URL 過期后,無法再進行重定向。

技術(shù)棧

  • Spring Boot: 用于快速構(gòu)建 RESTful API 服務(wù)。
  • H2 數(shù)據(jù)庫: 用于存儲 URL 和相關(guān)元數(shù)據(jù)。
  • Java UUID: 生成唯一短碼。
  • Java 定時任務(wù): 自動清理過期 URL。

Step 1: 項目結(jié)構(gòu)

src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── example/
│   │           ├── UrlShortenerApplication.java
│   │           ├── controller/
│   │           │   └── UrlController.java
│   │           ├── model/
│   │           │   └── Url.java
│   │           ├── repository/
│   │           │   └── UrlRepository.java
│   │           └── service/
│   │               └── UrlService.java
│   └── resources/
│       └── application.properties

Step 2: 創(chuàng)建實體類 Url

Url.java 是用于存儲長 URL、短 URL 以及相關(guān)元數(shù)據(jù)的實體類。

package com.example.model;

import javax.persistence.*;
import java.time.LocalDateTime;

@Entity
public class Url {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String originalUrl;
    private String shortCode;
    private LocalDateTime createdAt;
    private LocalDateTime expiresAt;
    private int visitCount;

    public Url() {}

    public Url(String originalUrl, String shortCode, LocalDateTime createdAt, LocalDateTime expiresAt) {
        this.originalUrl = originalUrl;
        this.shortCode = shortCode;
        this.createdAt = createdAt;
        this.expiresAt = expiresAt;
        this.visitCount = 0;
    }

    // getters and setters
}

Step 3: 創(chuàng)建 Repository 接口

使用 Spring Data JPA,我們可以快速創(chuàng)建一個操作數(shù)據(jù)庫的接口。

package com.example.repository;

import com.example.model.Url;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.Optional;

public interface UrlRepository extends JpaRepository<Url, Long> {
    Optional<Url> findByShortCode(String shortCode);
    void deleteByExpiresAtBefore(LocalDateTime dateTime);
}

Step 4: 編寫服務(wù)類 UrlService

UrlService.java 包含業(yè)務(wù)邏輯,例如生成短 URL、處理 URL 重定向、統(tǒng)計訪問量等。

package com.example.service;

import com.example.model.Url;
import com.example.repository.UrlRepository;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Optional;
import java.util.UUID;

@Service
public class UrlService {
    private final UrlRepository urlRepository;

    public UrlService(UrlRepository urlRepository) {
        this.urlRepository = urlRepository;
    }

    public String shortenUrl(String originalUrl, int expirationDays) {
        String shortCode = UUID.randomUUID().toString().substring(0, 8); // 生成短碼
        LocalDateTime createdAt = LocalDateTime.now();
        LocalDateTime expiresAt = createdAt.plusDays(expirationDays);

        Url url = new Url(originalUrl, shortCode, createdAt, expiresAt);
        urlRepository.save(url);

        return shortCode;
    }

    public Optional<Url> getOriginalUrl(String shortCode) {
        Optional<Url> urlOptional = urlRepository.findByShortCode(shortCode);
        urlOptional.ifPresent(url -> {
            if (url.getExpiresAt().isAfter(LocalDateTime.now())) {
                url.setVisitCount(url.getVisitCount() + 1);
                urlRepository.save(url);
            }
        });
        return urlOptional.filter(url -> url.getExpiresAt().isAfter(LocalDateTime.now()));
    }

    public int getVisitCount(String shortCode) {
        return urlRepository.findByShortCode(shortCode)
                .map(Url::getVisitCount)
                .orElse(0);
    }

    // 定時任務(wù)清理過期 URL
    public void cleanUpExpiredUrls() {
        urlRepository.deleteByExpiresAtBefore(LocalDateTime.now());
    }
}

Step 5: 編寫 Controller

UrlController.java 是與前端或其他客戶端交互的層。

package com.example.controller;

import com.example.model.Url;
import com.example.service.UrlService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Optional;

@RestController
@RequestMapping("/api/url")
public class UrlController {

    private final UrlService urlService;

    public UrlController(UrlService urlService) {
        this.urlService = urlService;
    }

    @PostMapping("/shorten")
    public ResponseEntity<String> shortenUrl(@RequestParam String originalUrl, @RequestParam(defaultValue = "7") int expirationDays) {
        String shortCode = urlService.shortenUrl(originalUrl, expirationDays);
        return ResponseEntity.ok("Shortened URL: http://localhost:8080/api/url/" + shortCode);
    }

    @GetMapping("/{shortCode}")
    public ResponseEntity<?> redirectUrl(@PathVariable String shortCode) {
        Optional<Url> urlOptional = urlService.getOriginalUrl(shortCode);
        return urlOptional
                .map(url -> ResponseEntity.status(302).header("Location", url.getOriginalUrl()).build())
                .orElse(ResponseEntity.notFound().build());
    }

    @GetMapping("/{shortCode}/stats")
    public ResponseEntity<Integer> getUrlStats(@PathVariable String shortCode) {
        int visitCount = urlService.getVisitCount(shortCode);
        return ResponseEntity.ok(visitCount);
    }
}

Step 6: 定時清理任務(wù)

Spring Boot 可以通過 @Scheduled 注解定期執(zhí)行任務(wù)。我們可以創(chuàng)建一個任務(wù)來清理過期的 URL。

package com.example.service;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class CleanupTask {

    private final UrlService urlService;

    public CleanupTask(UrlService urlService) {
        this.urlService = urlService;
    }

    @Scheduled(cron = "0 0 0 * * ?")  // 每天午夜執(zhí)行一次
    public void cleanExpiredUrls() {
        urlService.cleanUpExpiredUrls();
    }
}

Step 7: 配置文件

在 application.properties 中配置 H2 數(shù)據(jù)庫以及其他 Spring Boot 配置。

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update

Step 8: 啟動類 UrlShortenerApplication.java

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class UrlShortenerApplication {

    public static void main(String[] args) {
        SpringApplication.run(UrlShortenerApplication.class, args);
    }
}

運行服務(wù)

  • 使用 POST 請求 /api/url/shorten 提交長 URL 并獲取短 URL。
  • 使用 GET 請求 /api/url/{shortCode} 重定向到原始 URL。
  • 使用 GET 請求 /api/url/{shortCode}/stats 獲取短 URL 的訪問量。
  • 每天定時任務(wù)會清理過期的 URL。

總結(jié)

通過 Spring Boot 框架,我們可以快速構(gòu)建一個帶有定時任務(wù)、訪問統(tǒng)計以及過期處理的 URL 縮短服務(wù)。在真實場景中,可能還會涉及更多的功能,如用戶身份驗證、URL 黑名單過濾等。

到此這篇關(guān)于springboot中縮短一個url鏈接的實現(xiàn)的文章就介紹到這了,更多相關(guān)springboot縮短url鏈接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?AOP手寫動態(tài)代理代碼實例

    Spring?AOP手寫動態(tài)代理代碼實例

    這篇文章主要介紹了Spring?AOP手寫動態(tài)代理代碼實例,AOP我們知道,是在不修改源代碼的情況下,為代碼添加一些新功能的技術(shù),通過動態(tài)代理,可以在不修改原始類代碼的前提下,對方法進行攔截和增強,需要的朋友可以參考下
    2024-01-01
  • Java設(shè)計模式之策略模式_動力節(jié)點Java學院整理

    Java設(shè)計模式之策略模式_動力節(jié)點Java學院整理

    策略模式是對算法的封裝,把一系列的算法分別封裝到對應(yīng)的類中,并且這些類實現(xiàn)相同的接口,相互之間可以替換。接下來通過本文給大家分享Java設(shè)計模式之策略模式,感興趣的朋友一起看看吧
    2017-08-08
  • 使用java實現(xiàn)Xmodem協(xié)議

    使用java實現(xiàn)Xmodem協(xié)議

    這篇文章主要介紹了使用java實現(xiàn)Xmodem協(xié)議的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Logback 使用TurboFilter實現(xiàn)日志級別等內(nèi)容的動態(tài)修改操作

    Logback 使用TurboFilter實現(xiàn)日志級別等內(nèi)容的動態(tài)修改操作

    這篇文章主要介紹了Logback 使用TurboFilter實現(xiàn)日志級別等內(nèi)容的動態(tài)修改操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring-boot中使用spring-boot-devtools的實現(xiàn)代碼

    spring-boot中使用spring-boot-devtools的實現(xiàn)代碼

    這篇文章主要介紹了spring-boot中使用spring-boot-devtools的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Java實現(xiàn)學生成績管理系統(tǒng)

    Java實現(xiàn)學生成績管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)學生成績管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • 詳解MyBatis配置typeAliases的方法

    詳解MyBatis配置typeAliases的方法

    這篇文章主要介紹了詳解MyBatis配置typeAliases的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java中BeanUtils.copyProperties()詳解及應(yīng)用場景

    Java中BeanUtils.copyProperties()詳解及應(yīng)用場景

    BeanUtils.copyProperties()是Apache?Commons?BeanUtils提供的方法,用于Java對象間屬性的復制,特別適用于DTO、VO和Entity之間的數(shù)據(jù)傳遞,這篇文章主要介紹了Java中BeanUtils.copyProperties()詳解及應(yīng)用場景的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • Java中獲取年份月份的幾種常見方法

    Java中獲取年份月份的幾種常見方法

    這篇文章主要給大家介紹了關(guān)于Java中獲取年份月份的幾種常見方法,在開發(fā)應(yīng)用程序時,經(jīng)常需要獲取當前的年、月、日,并以特定格式進行展示或處理,需要的朋友可以參考下
    2023-09-09
  • IDEA開啟Run Dashboard的幾種方式

    IDEA開啟Run Dashboard的幾種方式

    Run Dashboard 是 IntelliJ IDEA 中的一個工具窗口,用于管理和監(jiān)視項目中正在運行的應(yīng)用程序和配置,它提供了一種集中管理運行和調(diào)試過程的方式,本文給大家介紹了IDEA開啟Run Dashboard的幾種方式,需要的朋友可以參考下
    2024-03-03

最新評論