偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

短鏈跳轉(zhuǎn)不再煩惱!SpringBoot 一鍵解決方案

開發(fā) 前端
通過本文的講解,我們成功實(shí)現(xiàn)了一個(gè)基于 Spring Boot 的短鏈接服務(wù),從短鏈接的生成到跳轉(zhuǎn)完成了全鏈路功能設(shè)計(jì)。在實(shí)現(xiàn)過程中,我們使用了 MyBatis-Plus 簡化數(shù)據(jù)訪問邏輯,通過精心設(shè)計(jì)的服務(wù)層確保了短鏈接的生成唯一性和效率。?

在現(xiàn)代互聯(lián)網(wǎng)中,短鏈接作為一種高效的 URL 縮短和分享方式,被廣泛應(yīng)用于社交媒體、電子郵件營銷以及各類平臺中。然而,如何實(shí)現(xiàn)短鏈接跳轉(zhuǎn)功能,同時(shí)確保系統(tǒng)的穩(wěn)定性與高效性,成為開發(fā)者面臨的一項(xiàng)重要挑戰(zhàn)。

本篇文章將通過 SpringBoot 提供的一鍵解決方案,幫助開發(fā)者快速實(shí)現(xiàn)短鏈接跳轉(zhuǎn)功能。

短鏈跳轉(zhuǎn)的意義

用戶體驗(yàn)優(yōu)化

短鏈接長度短、外觀簡潔,能夠大幅提升用戶在鏈接分享與點(diǎn)擊過程中的體驗(yàn)。

數(shù)據(jù)統(tǒng)計(jì)與跟蹤

通過短鏈接,可以有效追蹤鏈接的點(diǎn)擊情況,為營銷活動提供關(guān)鍵數(shù)據(jù)支持。

安全性與管理

短鏈接可以通過跳轉(zhuǎn)規(guī)則和權(quán)限控制,避免鏈接被濫用,并提升鏈接管理效率。

SpringBoot中的代碼實(shí)現(xiàn)

數(shù)據(jù)庫表設(shè)計(jì)

表結(jié)構(gòu)保持不變:

CREATE TABLE url_map (
    id BIGINTAUTO_INCREMENTPRIMARYKEY,
    long_url VARCHAR(2083)NOTNULL,
    short_url VARCHAR(255)NOTNULL,
    username VARCHAR(255)NOTNULL,
    expire_time DATETIME,
    creation_time DATETIMEDEFAULTCURRENT_TIMESTAMP
);

SpringBoot中的代碼實(shí)現(xiàn)

利用 MyBatis-Plus 的注解,簡化實(shí)體類定義:

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("url_map")
public classUrlMap{
    @TableId
    private Long id;
    private String longUrl;
    private String shortUrl;
    private String username;
    private LocalDateTime expireTime;
    private LocalDateTime creationTime;
}

Mapper 接口

MyBatis-Plus 自動生成 SQL,無需手動編寫 XML 映射文件:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.icoderoad.entity.UrlMap;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UrlMapMapper extends BaseMapper<UrlMap> {
}

服務(wù)層

服務(wù)層實(shí)現(xiàn)短鏈接生成和解析邏輯:

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.icoderoad.entity.UrlMap;
import com.icoderoad.mapper.UrlMapMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.time.LocalDateTime;

@Service
public class UrlMapService{
    @Resource
    private UrlMapMapper urlMapMapper;

    public Stringencode(String longUrl,String username){
        QueryWrapper<UrlMap> queryWrapper =new QueryWrapper<>();
        queryWrapper.eq("long_url", longUrl).eq("username", username);
        UrlMap existingMap = urlMapMapper.selectOne(queryWrapper);

        if(existingMap !=null){
            return existingMap.getShortUrl();
        }

        String shortUrl =generateShortLink(longUrl, username);
        UrlMap newMap = new UrlMap();
        newMap.setLongUrl(longUrl);
        newMap.setShortUrl(shortUrl);
        newMap.setUsername(username);
        newMap.setCreationTime(LocalDateTime.now());

        urlMapMapper.insert(newMap);
        return shortUrl;
    }

    public Stringdecode(String shortUrl){
        QueryWrapper<UrlMap> queryWrapper =new QueryWrapper<>();
        queryWrapper.eq("short_url", shortUrl);
        UrlMap urlMap = urlMapMapper.selectOne(queryWrapper);

        return urlMap !=null? urlMap.getLongUrl():"https://defaultpage.com";
    }

    private StringgenerateShortLink(String longUrl,String username){
        try{
            MessageDigest md =MessageDigest.getInstance("SHA-256");
            byte[] hash = md.digest((longUrl + username).getBytes());
            StringBuilder shortUrlBuilder =newStringBuilder();
            for(byte b : hash){
                shortUrlBuilder.append(String.format("%02x", b));
            }
            return shortUrlBuilder.substring(0,8);
        }catch(NoSuchAlgorithmException e){
            throw new RuntimeException("Error generating short link", e);
        }
    }
}

控制層

控制器提供 REST 接口:

import com.icoderoad.common.ResponseBean;
import com.icoderoad.service.UrlMapService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.RedirectView;

import javax.annotation.Resource;

@RestController
public class UrlMapController{
    @Resource
    private UrlMapService urlMapService;

    @PostMapping("/shorten")
    public ResponseBean<String> shorten(@RequestParamString longUrl,@RequestParamString username){
        String shortUrl = urlMapService.encode(longUrl, username);
        returnResponseBean.success(shortUrl);
    }

    @GetMapping("/redirect")
    public RedirectViewredirect(@RequestParamString shortUrl){
        String longUrl = urlMapService.decode(shortUrl);
        return new RedirectView(longUrl);
    }
}

返回結(jié)果類

返回結(jié)果的封裝類:

public class ResponseBean<T>{
    private boolean success;
    private T data;

    public static<T> ResponseBean<T> success(T data){
        ResponseBean<T> response =new ResponseBean<>();
        response.success =true;
        response.data = data;
        return response;
    }

    public static<T>ResponseBean<T> error(){
        ResponseBean<T> response =new ResponseBean<>();
        response.success =false;
        return response;
    }
}

項(xiàng)目依賴

在 pom.xml 中添加 MyBatis-Plus 相關(guān)依賴:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

結(jié)果測試

創(chuàng)建短鏈接

通過 Postman 或 cURL 發(fā)送 POST 請求,創(chuàng)建短鏈接:

使用 Postman 測試

1.設(shè)置請求類型為POST,請求地址為:

http://localhost:8080/shorten

2.在請求體中選擇 x-www-form-urlencoded,添加以下參數(shù):

  • longUrl: https://www.example.com
  • username: test_user

3.點(diǎn)擊發(fā)送請求,響應(yīng)示例如下:

{
  "success": true,
  "data": "http://localhost:8080/redirect?shortUrl=abcd1234"
}

使用 cURL 測試

運(yùn)行以下命令:

curl -X POST http://localhost:8080/shorten \
     -d "longUrl=https://www.example.com" \
     -d "username=test_user"

響應(yīng):

{
  "success": true,
  "data": "http://localhost:8080/redirect?shortUrl=abcd1234"
}

短鏈接跳轉(zhuǎn)測試

測試步驟

1.在瀏覽器地址欄輸入生成的短鏈接,例如:

http://localhost:8080/redirect?shortUrl=abcd1234

2.按下回車鍵,瀏覽器將跳轉(zhuǎn)到原始鏈接:

https://www.example.com

響應(yīng)驗(yàn)證

通過 瀏覽器開發(fā)者工具 或 Postman,可以觀察 HTTP 重定向的響應(yīng)頭,確認(rèn)跳轉(zhuǎn)是否正確。例如:

HTTP/1.1 302 Found
Location: https://www.example.com

測試成功

當(dāng)瀏覽器成功跳轉(zhuǎn)到 https://www.example.com 時(shí),說明短鏈接跳轉(zhuǎn)功能正常工作。

總結(jié)

通過本文的講解,我們成功實(shí)現(xiàn)了一個(gè)基于 Spring Boot 的短鏈接服務(wù),從短鏈接的生成到跳轉(zhuǎn)完成了全鏈路功能設(shè)計(jì)。在實(shí)現(xiàn)過程中,我們使用了 MyBatis-Plus 簡化數(shù)據(jù)訪問邏輯,通過精心設(shè)計(jì)的服務(wù)層確保了短鏈接的生成唯一性和效率。

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2009-10-22 16:32:10

布線系統(tǒng)短鏈路問題

2012-09-27 09:22:54

Orange云計(jì)算解決方案云服務(wù)

2014-12-17 13:03:04

賽門鐵克災(zāi)難恢復(fù)Windows Azu

2023-11-15 18:11:47

網(wǎng)絡(luò)故障以太網(wǎng)DOWN

2018-01-26 08:39:03

2022-04-07 13:56:13

前端一鍵換膚

2022-05-19 14:40:21

網(wǎng)絡(luò)安全5G邊緣計(jì)算

2015-08-25 10:32:41

PDU

2022-05-19 13:33:39

系統(tǒng)客戶端鏈路追蹤

2010-03-23 16:43:39

負(fù)載均衡互聯(lián)網(wǎng)鏈路深信服科技

2020-06-22 21:38:58

冷鏈管理物聯(lián)網(wǎng)

2024-02-22 11:23:16

2013-09-16 09:07:15

網(wǎng)絡(luò)配置備份NCM

2015-02-09 15:25:52

換膚

2019-01-18 05:22:39

區(qū)塊鏈智能合約網(wǎng)絡(luò)安全

2015-08-19 14:19:42

2023-10-30 16:18:03

供應(yīng)鏈管理綜合物流

2018-07-03 15:56:59

騰訊

2019-02-18 20:14:12

AWS區(qū)塊鏈應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號