0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

长短链接原理案例

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-08 14:31 次阅读

最近在做一套推广系统,将其中涉及的长短链接问题在这里分享一下。推广方式主要是以短信方式慰问客户并推送宣传链接(非广告),但链接真的是太长了,先不说短信按字数收费问题,就是看到就想立刻删除。所以组织就安排研究如何让链接变短,精简干练。

关于长短链接

  • 长链接 :顾名思义,就是网页的完整URL地址,点击即可跳转至网页,进行内容浏览。
  • 短链接 :就是将长链接进行处理后转换成长度较小的URL地址,如 https://sourl.cn/upNbxj 则是长链接 https://blog.csdn.net/qq_39486758/article/details/126602389 处理之后的结果。
  • 短链接相较于长链接,会更简短,便于一些第三方平台的字符长度限制等问题处理,当然对于小编来说,可以省下不少短信费用,能不能“升官发财”就靠它了~~

长短链接原理

  • 当我们在网站输入短链接后,DNS会解析链接的ip地址(即 短链接服务器 ),然后DNS转发请求( HTTP GET )至短链接服务器,通过短链接码换取对应的 完整URL地址 ,最后短链接服务器通过请求( HTTP 301 )重定向到完整URL地址,至此完成解析。可以参考时序图:

图片

注:短链接跳转长链接可以采用301(永久重定向),也可以采用302(临时重定向),区别就是对资源的管理,301会将旧资源永久移除,替换为重定向的新资源;而302还是会保留旧资源,只是重定向到新资源,并不会发生替换,也不会保存新资源。

  • 自研短链接服务 :由于开源项目存在不确定性,不得不自己搭建一套短链接服务,满足使用需求。一是便于维护,二是可以灵活扩展。接下来结合代码进行分析。
    • 首先是生成短链接码的算法工具类,算法不是固定的,可以根据自己习惯或工作要求使用其它的算法生成,最主要是保证短链接码的唯一性。
/**
 * 进制转换工具
 */
public class BaseUtil {


    // 62进制转换率
    private static int SCALE_62 = 62;
    // 62进制,索引位置代表转换字符的数值 0-61,比如 A代表10,z代表61
    private static String CHARS_62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    /**
     * 十进制数字转换为62进制字符串
     * @param value 十进制数字
     * @return 62进制字符串
     */
    public static String encode10to62(long value) {
        if (value < 0) {
            throw new IllegalArgumentException("参数非法(必须为非负数): " + value);
        }
        StringBuilder stringBuilder = new StringBuilder();
        while (value > SCALE_62 - 1) {
            stringBuilder.append(CHARS_62.charAt((int) (value % SCALE_62)));
            value = value / SCALE_62;
        }
        // 获取最高位
        stringBuilder.append(CHARS_62.charAt((int) (value % SCALE_62)));
        return stringBuilder.reverse().toString();
    }


    /**
     * 将10进制数字转换为长度为length的62进制字符串
     * 原始62进制字符串长度小于length,左侧用‘0’填充补齐


     * @param value  十进制数字
     * @param length 长度
     * @return 长度为length或大于length的62进制字符串
     */
    public static String encode10to62(long value, int length) {
        if (length < 1) {
            throw new IllegalArgumentException("参数非法(长度必须大于0): " + value);
        }
        String str62Base = encode10to62(value);
        if (str62Base.length() < length) {
            long num = (long) Math.pow(10, length);
            str62Base = num + str62Base;
            str62Base = str62Base.substring(str62Base.length() - length);
        }
        return str62Base;
    }
    /**
     * 62进制编码转换为10进制编码


     * @param str62Base 62进制编码
     * @return 十进制编码
     */
    public static long encode62to10(String str62Base) {
        if (str62Base == null || !str62Base.matches("[a-zA-Zd]+")) {
            throw new IllegalArgumentException("参数非法(非62进制): " + str62Base);
        }
        int length = str62Base.length();
        long value = 0;
        for (int index = 0; index < length; index++) {
            value = value * SCALE_62 + base62To10(str62Base.charAt(index));
        }
        return value;
    }
    /**
     * 62进制字符转换成对应十进制表示


     * @param base62 62进制
     * @return 十进制
     */
    private static int base62To10(char base62) {
        int value = base62;
        // ‘0-9’  0-9
        // ‘0’ ASCII字符代码表 十进制48
        // ‘9’ ASCII字符代码表 十进制57
        if (value <= 57) value = value - 48;
            // ‘A-Z’  10-35
            // ‘A’ ASCII字符代码表 十进制65
            // ‘Z’ ASCII字符代码表 十进制90
        else if (value <= 90) value = value - 65 + 10;
            // ‘a-z’  36-61
            // ‘a’ ASCII字符代码表 十进制97
            // ‘Z’ ASCII字符代码表 十进制122
        else value = value - 97 + 36;
        return value;
    }
}
  • 然后就是维护短链接的 关系映射 ,此处小编采用的是集合变量,建议采用Mysql等数据库将关系数据持久化,避免数据丢失,导致访问失败。
/*
     * 短链接服务器地址  根据自己实际场景替换
     * */
    private String domainName = "http://192.168.0.76:8822";


    /*
    * 短链接与长链接映射关系集合
    * */
    private Map< Long, String > urlMap = new HashMap<  >();


    /**
     * 长链接编码成短链接


     * @param originUrl 原始链接(长链接)
     * @return 短链接
     */
    public String encode(String originUrl) {


        long id = System.currentTimeMillis();
        String code = BaseUtil.encode10to62(id, 5);
        urlMap.put(id, originUrl);
        return domainName + "/redirect/" + code;
    }
  • 提供转发处理接口,本质就是访问短链接服务的接口,完成解析到重定向的处理,至此,短链接服务器完成使命(同时在处理过程中可以增加访问记录等埋点操作)。
/**
     * 解码重定向
     *
     * @param url 原始链接的编码
     * @return 重定向
     */
    @GetMapping("/redirect/{url}")
    public ModelAndView redirect(@PathVariable String url) {
        long id = BasetUtil.encode62to10(smartUrl);
        String originUrl = urlMap.get(id);
        RedirectView redirectView=new RedirectView(originUrl);
        // 301永久重定向,避免网络劫持
        redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
        return new ModelAndView(redirectView);
    }
  • 模拟操作过程:本地启动短链接服务,再启动一个业务服务作为长链接服务,将长链接生成短链接,然后访问短链接并成功跳转至长链接地址。演示结果

图片

图片

图片

总结

  • 以上就是本文所分享的全部内容,当然不止这一种实现方式,有想法的小伙伴可以私信探讨。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8116

    浏览量

    82518
  • ip地址
    +关注

    关注

    0

    文章

    240

    浏览量

    16741
  • 网页
    +关注

    关注

    0

    文章

    69

    浏览量

    18876
收藏 人收藏

    评论

    相关推荐

    一文弄懂Linux硬链接和软链接

    在Linux系统下,有两种链接文件:一种是硬链接(Hard Link);另一种是软链接,也称为符号链接(Symbolic Link)。
    发表于 10-21 14:26 1175次阅读

    请问哪款电子电路设计软件能实现下面功能?

    我在原理图上把电子元件放在图纸上并连好线,然后拖动电子元件的同时连线也跟随元件移动,元件改变位置或方向的时候,连线会自动调整位置和方向以及连线的长短链接属性不变。不知道应该用哪款设计软件能实现(简单好上手的软件),希望大神们告知一下,谢谢!
    发表于 02-28 16:51

    WAVECOM CDMA MODEM开发包 C#CDMA短信开发包 长短

    信控件,长短信发送软件,短信数据库接口COM组件短信猫开发包|SDK、API开发包|16进制短信|超长短信编码DELPHI短信接口| DLL动态链接库API|短信控件OCX| SDK开发包联移GSM
    发表于 07-23 09:08

    请问怎么设置GSM模块使其支持长短信接收?

    项目使用有方公司Neoway M660模块,单片机通过串口发送AT指令来控制。目前已经实现了单条短信接收,接下来想支持一下长短信接收(比如5条连续内容的长短信)。测试了一下,发给模块的长短信被分成
    发表于 05-31 03:53

    长短时记忆网络的前向计算

    长短时记忆网络长短时记忆网络的前向计算长短时记忆网络的训练
    发表于 02-01 07:09

    矩阵键盘长短按的识别

    定时器三行代码 矩阵键盘长短按的识别 九层妖塔 起于垒土【蓝桥杯】—{模块}—{矩阵键盘Part_1}矩阵键盘四、Template2矩阵键盘四、Template2
    发表于 12-09 07:52

    独立按键长短按的代码分享

    独立按键长短按的代码分享
    发表于 01-20 07:52

    基于长短期记忆模型的多维主题模型

    针对中文微博全局性情感倾向分类的准确性不高的问题,提出基于长短期记忆模型的多维主题模型( MT-LSTM)。该模型是一个多层多维序列计算模型,由多维长短期记忆(LSTM)细胞网络组成,适用于处理向量
    发表于 12-14 15:33 1次下载
    基于<b class='flag-5'>长短</b>期记忆模型的多维主题模型

    5G时代的链接将是智能化的链接

    。” 在李正茂看来,第一个C是链接,5G强调的仍然是链接。李正茂指出:“链接是基础,但5G时代的链接是智能化的链接。”
    发表于 05-23 09:02 694次阅读

    电线的长短对电流有影响吗

    电线距离长短对电流是有影响的。因为电线的电阻和长度成正比,在供电系统中电线就相当于串联在供电回路里的电阻,根据Ⅰ=U/R。这就是说在电压一定的前提下,电线越长式中的R越大,电流Ⅰ越小。
    的头像 发表于 01-11 09:14 3.3w次阅读
    电线的<b class='flag-5'>长短</b>对电流有影响吗

    按客户需求定制长短脚工字电感

    长短脚,通过图片,可观察到这款工字电感为长短脚,其中长脚为出线端,短脚为起始端。工字电感长短脚是工字电感生产之前便制作好的,确定长短脚后,再进行电感的绕制。
    发表于 04-28 14:21 697次阅读

    Linux中的软链接、硬链接都用在哪些场合?

    最近,看到很多文章都在介绍 Linux 中的文件系统,其中就包括:inode 节点、软链接、硬链接等重要的概念。 于是就有小伙伴私信问我:这些概念我都懂,但是我能利用他们来完成什么工作呢? 或者说
    的头像 发表于 06-21 16:33 1494次阅读

    PyTorch教程之长短期记忆(LSTM)

    电子发烧友网站提供《PyTorch教程之长短期记忆(LSTM).pdf》资料免费下载
    发表于 06-05 09:51 0次下载
    PyTorch教程之<b class='flag-5'>长短</b>期记忆(LSTM)

    链接PK软链接

    链接PK软链接
    的头像 发表于 10-12 18:16 806次阅读

    链接与硬链接的区别

    链接又叫符号链接,和原文件不是一个文件,类似Windows的快捷方式,如果原始文件被删除,所有指向它的符号链接也就都被破坏了
    的头像 发表于 04-19 10:09 74次阅读
    软<b class='flag-5'>链接</b>与硬<b class='flag-5'>链接</b>的区别