前言
平时再给别人分享链接时,有时看到这长长的连接很不人性,然后就会有了长链转短链的服务。
这里将使用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 就是生成的短链了
温馨提示服务器将在国庆结束后过期
以上内容属于个人笔记整理,如有错误,欢迎批评指正!