java 实现 生成短链接服务

timo-nbktp 1年前 ⋅ 975 阅读

java实现短链接转换服务

类似上图这种短信,对应的就是一个短链接。
看到原理也不难,于是先写个最简易版的玩玩,以后有需求了再补充吧

下面是一个简易版的短链接生成代码

搭个spring-boot服务,复制这两个controller,就能看到效果。

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Random;

/**
 * @Description: 发号器随机生成
 */
@RestController
@RequestMapping("/shortUrl")
public class ShortUrlController {

    private String BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    // 短链url域名前缀
    private String shortUrlPrefix = "http://a.cn/";
    private HashMap<String, String> map = new HashMap<>();

    @RequestMapping("getShortUrl")
    public String getShortUrl(String longUrl) {
        String key = creatKey();
        while (map.containsKey(key)) {
            key = creatKey();
        }
        map.put(key, longUrl);
        return shortUrlPrefix + key;
    }

    @RequestMapping("getLongUrl")
    public String getLongUrl(String shortUrl) {
        return map.get(shortUrl.replace(shortUrlPrefix, ""));
    }

    private String creatKey() {
        Random rand = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 6; i++) {
            sb.append(BASE62.charAt(rand.nextInt(62)));
        }
        return sb.toString();
    }
}
import com.zs.qunfx.util.Base62Util;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;

/**
 * @Description: 发号器自增生成
 */
@RestController
@RequestMapping("/shortUrl2")
public class ShortUrl2Controller {

    // 短链url域名前缀
    private String shortUrlPrefix = "http://a.cn/";
    private HashMap<String, String> map = new HashMap<>();
    private Long num = 1000000L;

    @RequestMapping("getShortUrl")
    public String getShortUrl(String longUrl) {
        String key = creatKey();
        map.put(key, longUrl);
        return shortUrlPrefix + key;
    }

    @RequestMapping("getLongUrl")
    public String getLongUrl(String shortUrl) {
        return map.get(shortUrl.replace(shortUrlPrefix, ""));
    }

    private String creatKey() {
        String base62 = Base62Util.base62Encode(num);
        num++;
        return base62;
    }
}

最后

现在常用的还是第二种,用自增的发号器生成对应的短链接。
生产环境要用,可以用数据库的自增id来发号,或者分布式下生成id用类似雪花算法来发号。
同时,避免原始链接重复,可做重复判断,可用布隆过滤器或redis

长链接和短链接的对应关系,可保存在数据库,也可保存在类似redis中,顺带还可以设置过期时间。

也有开源的生成短链接的,比如yourls,PHP实现,安装只需要装PHP和mysql即可。

或者也可以直接购买短链接服务,比如百度的短链接服务,亚马逊的短链接服务等,按需付费。

 

----end----------

 

 

版权 本着开源共享、共同学习的精神,本文转载自 https://blog.csdn.net/java_zhangshuai/article/details/106942758 , 如果侵权之处,请联系博主进行删除,谢谢~