短链跳转不再烦恼!SpringBoot 一键解决方案

开发 前端
通过本文的讲解,我们成功实现了一个基于 Spring Boot 的短链接服务,从短链接的生成到跳转完成了全链路功能设计。在实现过程中,我们使用了 MyBatis-Plus 简化数据访问逻辑,通过精心设计的服务层确保了短链接的生成唯一性和效率。​

在现代互联网中,短链接作为一种高效的 URL 缩短和分享方式,被广泛应用于社交媒体、电子邮件营销以及各类平台中。然而,如何实现短链接跳转功能,同时确保系统的稳定性与高效性,成为开发者面临的一项重要挑战。

本篇文章将通过 SpringBoot 提供的一键解决方案,帮助开发者快速实现短链接跳转功能。

短链跳转的意义

用户体验优化

短链接长度短、外观简洁,能够大幅提升用户在链接分享与点击过程中的体验。

数据统计与跟踪

通过短链接,可以有效追踪链接的点击情况,为营销活动提供关键数据支持。

安全性与管理

短链接可以通过跳转规则和权限控制,避免链接被滥用,并提升链接管理效率。

SpringBoot中的代码实现

数据库表设计

表结构保持不变:

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中的代码实现

利用 MyBatis-Plus 的注解,简化实体类定义:

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> {
}

服务层

服务层实现短链接生成和解析逻辑:

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);
    }
}

返回结果类

返回结果的封装类:

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;
    }
}

项目依赖

在 pom.xml 中添加 MyBatis-Plus 相关依赖:

<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>

结果测试

创建短链接

通过 Postman 或 cURL 发送 POST 请求,创建短链接:

使用 Postman 测试

1.设置请求类型为POST,请求地址为:

http://localhost:8080/shorten

2.在请求体中选择 x-www-form-urlencoded,添加以下参数:

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

3.点击发送请求,响应示例如下:

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

使用 cURL 测试

运行以下命令:

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

响应:

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

短链接跳转测试

测试步骤

1.在浏览器地址栏输入生成的短链接,例如:

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

2.按下回车键,浏览器将跳转到原始链接:

https://www.example.com

响应验证

通过 浏览器开发者工具 或 Postman,可以观察 HTTP 重定向的响应头,确认跳转是否正确。例如:

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

测试成功

当浏览器成功跳转到 https://www.example.com 时,说明短链接跳转功能正常工作。

总结

通过本文的讲解,我们成功实现了一个基于 Spring Boot 的短链接服务,从短链接的生成到跳转完成了全链路功能设计。在实现过程中,我们使用了 MyBatis-Plus 简化数据访问逻辑,通过精心设计的服务层确保了短链接的生成唯一性和效率。

责任编辑:武晓燕 来源: 路条编程
相关推荐

2009-10-22 16:32:10

布线系统短链路问题

2012-09-27 09:22:54

Orange云计算解决方案云服务

2014-12-17 13:03:04

赛门铁克灾难恢复Windows Azu

2023-11-15 18:11:47

网络故障以太网DOWN

2018-01-26 08:39:03

2022-04-07 13:56:13

前端一键换肤

2015-08-25 10:32:41

PDU

2022-05-19 13:33:39

系统客户端链路追踪

2022-05-19 14:40:21

网络安全5G边缘计算

2020-06-22 21:38:58

冷链管理物联网

2010-03-23 16:43:39

负载均衡互联网链路深信服科技

2024-02-22 11:23:16

2015-02-09 15:25:52

换肤

2019-05-29 13:58:56

阿里云企业级云灾备

2019-02-18 20:14:12

AWS区块链应用

2019-01-18 05:22:39

区块链智能合约网络安全

2015-08-19 14:19:42

2023-09-08 23:30:19

2013-09-16 09:07:15

网络配置备份NCM
点赞
收藏

51CTO技术栈公众号