springboot 实现长链接转短链接

Source

前言

平时再给别人分享链接时,有时看到这长长的连接很不人性,然后就会有了长链转短链的服务。
这里将使用java springboot 以及 mybatis-plus 来实现长链转短链。
完整代码将在文章最末尾。
至于mybatis-plus SpringBoot整合mybatis-plus–入门超详细

转换原理

将原url通过一系列方式,转换成8位短码(只要能不重复,随便怎么方式都行);将长短链接存入数据库,形成一条对应关系;访问短链接的时候,在数据库找到对应的长链接,并通过重定向实现原url的访问;(如果你的转换方式能过还原,也可以不要数据库,但必须保证转换后的短码不能重复)

核心代码

代码结构

在这里插入图片描述
这里为了篇幅只贴出重要代码

建表语句

DROP TABLE IF EXISTS `short_link`;
CREATE TABLE `short_link`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `shorts` varchar(30) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `short_link` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `long_link` text CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `create_time` timestamp(0) NOT NULL,
  `flag` int(0) NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

URLUtil.java

public class URLUtil {
    
      
    //生成短链接的八个字符
    public static String getShortURL() {
    
      
        Random random = new Random();

        // 要使用生成 URL 的字符
        char[] chars = new char[]{
    
      'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
                'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
                'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
                '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
                'U', 'V', 'W', 'X', 'Y', 'Z'
        };
        int ln = chars.length;
        StringBuilder key = new StringBuilder();
        for (int i = 0; i < 8; ++i) {
    
      
            key.append(chars[random.nextInt(ln)]);
        }

        return key.toString();
    }
}

ShortLinkController.java

@RestController
public class ShortLinkController {
    
      
    @Autowired
    ShortLinkServiceImpl shortLinkService;

    //生成分享链接
    @RequestMapping(value = "/share.do")
    public Result shareLink(HttpServletRequest request, String longLink) {
    
      
        Result result = new Result();
        if (longLink != null) {
    
      
            result.setData(shortLinkService.addShortLink(longLink, getUrlStart(request)));
            result.setStatus(true);
        }
        return result;
    }

    //实现短链跳转
    @RequestMapping(value = "/short/{shortLink}")
    public void sendRedirect(HttpServletResponse response,  @PathVariable String shortLink) {
    
      
        ShortLink shorts = shortLinkService.getLongLink(shortLink);
        if (shorts != null) {
    
      
            try {
    
      
                response.sendRedirect(shorts.getLongLink());
            } catch (IOException e) {
    
      
                e.printStackTrace();
            }
        }
    }

    //获取请求的协议域名,端口号生成连接的前半部分
    public String getUrlStart(HttpServletRequest request) {
    
      
        StringBuilder url = new StringBuilder();
        url.append(request.getScheme());
        System.out.println(url);
        url.append("://").append(request.getServerName());
        System.out.println(url);
        url.append(":").append(request.getServerPort());
        System.out.println(url);
//        url.append(request.getServletPath());
//        System.out.println(url);
        return url.toString();
    }
}

ShortLinkServiceImpl.java

@Service
public class ShortLinkServiceImpl {
    
      

    private ShortLinkMapper shortLinkMapper;

    @Autowired
    public void setShortLinkMapper(ShortLinkMapper shortLinkMapper) {
    
      
        this.shortLinkMapper = shortLinkMapper;
    }

    //通过长链生成对应短链并存在数据库中
    public ShortLink addShortLink(String longLink, String url) {
    
      
        url += "/short";
        ShortLink shortLink = new ShortLink();
        shortLink.setLongLink(longLink);
        shortLink.setShorts(URLUtil.getShortURL());
        shortLink.setShortLink(url + "/" + shortLink.getShorts());
        shortLinkMapper.insert(shortLink);
        return shortLink;
    }

    //通过短链查询到对应长链
    public  ShortLink getLongLink(String shorts) {
    
      
        QueryWrapper<ShortLink> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("shorts", shorts);
        return shortLinkMapper.selectOne(queryWrapper);
    }
}

完整代码链接

Github
https://github.com/KingJin-web/springboot/tree/master/other/src/main/java/com/king/other/short_link
短链
http://www.wuzhaoqi.top:9000/short/6LMAGNDt

接口

生成短链

http://www.wuzhaoqi.top:9000/share.do?

参数

{
    
      
"longLink": "https://github.com/KingJin-web/springboot/tree/master/other/src/main/java/com/king/other/short_link"
}

返回示例

{
    
      
     "status": true,
     "message": null,
     "data": {
    
      
          "id": 2,
          "shorts": "6LMAGNDt",
          "shortLink": "http://www.wuzhaoqi.top:9000/short/6LMAGNDt",
          "longLink": "https://github.com/KingJin-web/springboot/tree/master/other/src/main/java/com/king/other/short_link",
          "createTime": "2021-09-20T04:11:37.758",
          "flag": 0
     }
}

data.shortLink 就是生成的短链了
温馨提示服务器将在国庆结束后过期

以上内容属于个人笔记整理,如有错误,欢迎批评指正!