0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

長短鏈接原理案例

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 14:31 ? 次閱讀

最近在做一套推廣系統(tǒng),將其中涉及的長短鏈接問題在這里分享一下。推廣方式主要是以短信方式慰問客戶并推送宣傳鏈接(非廣告),但鏈接真的是太長了,先不說短信按字數(shù)收費問題,就是看到就想立刻刪除。所以組織就安排研究如何讓鏈接變短,精簡干練。

關(guān)于長短鏈接

  • 長鏈接 :顧名思義,就是網(wǎng)頁的完整URL地址,點擊即可跳轉(zhuǎn)至網(wǎng)頁,進行內(nèi)容瀏覽。
  • 短鏈接 :就是將長鏈接進行處理后轉(zhuǎn)換成長度較小的URL地址,如 https://sourl.cn/upNbxj 則是長鏈接 https://blog.csdn.net/qq_39486758/article/details/126602389 處理之后的結(jié)果。
  • 短鏈接相較于長鏈接,會更簡短,便于一些第三方平臺的字符長度限制等問題處理,當(dāng)然對于小編來說,可以省下不少短信費用,能不能“升官發(fā)財”就靠它了~~

長短鏈接原理

  • 當(dāng)我們在網(wǎng)站輸入短鏈接后,DNS會解析鏈接的ip地址(即 短鏈接服務(wù)器 ),然后DNS轉(zhuǎn)發(fā)請求( HTTP GET )至短鏈接服務(wù)器,通過短鏈接碼換取對應(yīng)的 完整URL地址 ,最后短鏈接服務(wù)器通過請求( HTTP 301 )重定向到完整URL地址,至此完成解析??梢詤⒖紩r序圖:

圖片

注:短鏈接跳轉(zhuǎn)長鏈接可以采用301(永久重定向),也可以采用302(臨時重定向),區(qū)別就是對資源的管理,301會將舊資源永久移除,替換為重定向的新資源;而302還是會保留舊資源,只是重定向到新資源,并不會發(fā)生替換,也不會保存新資源。

  • 自研短鏈接服務(wù) :由于開源項目存在不確定性,不得不自己搭建一套短鏈接服務(wù),滿足使用需求。一是便于維護,二是可以靈活擴展。接下來結(jié)合代碼進行分析。
    • 首先是生成短鏈接碼的算法工具類,算法不是固定的,可以根據(jù)自己習(xí)慣或工作要求使用其它的算法生成,最主要是保證短鏈接碼的唯一性。
/**
 * 進制轉(zhuǎn)換工具
 */
public class BaseUtil {


    // 62進制轉(zhuǎn)換率
    private static int SCALE_62 = 62;
    // 62進制,索引位置代表轉(zhuǎn)換字符的數(shù)值 0-61,比如 A代表10,z代表61
    private static String CHARS_62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    /**
     * 十進制數(shù)字轉(zhuǎn)換為62進制字符串
     * @param value 十進制數(shù)字
     * @return 62進制字符串
     */
    public static String encode10to62(long value) {
        if (value < 0) {
            throw new IllegalArgumentException("參數(shù)非法(必須為非負數(shù)): " + 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進制數(shù)字轉(zhuǎn)換為長度為length的62進制字符串
     * 原始62進制字符串長度小于length,左側(cè)用‘0’填充補齊


     * @param value  十進制數(shù)字
     * @param length 長度
     * @return 長度為length或大于length的62進制字符串
     */
    public static String encode10to62(long value, int length) {
        if (length < 1) {
            throw new IllegalArgumentException("參數(shù)非法(長度必須大于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進制編碼轉(zhuǎn)換為10進制編碼


     * @param str62Base 62進制編碼
     * @return 十進制編碼
     */
    public static long encode62to10(String str62Base) {
        if (str62Base == null || !str62Base.matches("[a-zA-Zd]+")) {
            throw new IllegalArgumentException("參數(shù)非法(非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進制字符轉(zhuǎn)換成對應(yīng)十進制表示


     * @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(chǎn)-z’  36-61
            // ‘a(chǎn)’ ASCII字符代碼表 十進制97
            // ‘Z’ ASCII字符代碼表 十進制122
        else value = value - 97 + 36;
        return value;
    }
}
  • 然后就是維護短鏈接的 關(guān)系映射 ,此處小編采用的是集合變量,建議采用Mysql等數(shù)據(jù)庫將關(guān)系數(shù)據(jù)持久化,避免數(shù)據(jù)丟失,導(dǎo)致訪問失敗。
/*
     * 短鏈接服務(wù)器地址  根據(jù)自己實際場景替換
     * */
    private String domainName = "http://192.168.0.76:8822";


    /*
    * 短鏈接與長鏈接映射關(guān)系集合
    * */
    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;
    }
  • 提供轉(zhuǎn)發(fā)處理接口,本質(zhì)就是訪問短鏈接服務(wù)的接口,完成解析到重定向的處理,至此,短鏈接服務(wù)器完成使命(同時在處理過程中可以增加訪問記錄等埋點操作)。
/**
     * 解碼重定向
     *
     * @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永久重定向,避免網(wǎng)絡(luò)劫持
        redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
        return new ModelAndView(redirectView);
    }
  • 模擬操作過程:本地啟動短鏈接服務(wù),再啟動一個業(yè)務(wù)服務(wù)作為長鏈接服務(wù),將長鏈接生成短鏈接,然后訪問短鏈接并成功跳轉(zhuǎn)至長鏈接地址。演示結(jié)果

圖片

圖片

圖片

總結(jié)

  • 以上就是本文所分享的全部內(nèi)容,當(dāng)然不止這一種實現(xiàn)方式,有想法的小伙伴可以私信探討。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8839

    瀏覽量

    84943
  • ip地址
    +關(guān)注

    關(guān)注

    0

    文章

    289

    瀏覽量

    16966
  • 網(wǎng)頁
    +關(guān)注

    關(guān)注

    0

    文章

    72

    瀏覽量

    19248
收藏 人收藏

    評論

    相關(guān)推薦

    一文弄懂Linux硬鏈接和軟鏈接

    在Linux系統(tǒng)下,有兩種鏈接文件:一種是硬鏈接(Hard Link);另一種是軟鏈接,也稱為符號鏈接(Symbolic Link)。
    發(fā)表于 10-21 14:26 ?1311次閱讀

    請問哪款電子電路設(shè)計軟件能實現(xiàn)下面功能?

    我在原理圖上把電子元件放在圖紙上并連好線,然后拖動電子元件的同時連線也跟隨元件移動,元件改變位置或方向的時候,連線會自動調(diào)整位置和方向以及連線的長短,鏈接屬性不變。不知道應(yīng)該用哪款設(shè)計軟件能實現(xiàn)(簡單好上手的軟件),希望大神們告知一下,謝謝!
    發(fā)表于 02-28 16:51

    WAVECOM CDMA MODEM開發(fā)包 C#CDMA短信開發(fā)包 長短

    信控件,長短信發(fā)送軟件,短信數(shù)據(jù)庫接口COM組件短信貓開發(fā)包|SDK、API開發(fā)包|16進制短信|超長短信編碼DELPHI短信接口| DLL動態(tài)鏈接庫API|短信控件OCX| SDK開發(fā)包聯(lián)移GSM
    發(fā)表于 07-23 09:08

    請問怎么設(shè)置GSM模塊使其支持長短信接收?

    項目使用有方公司Neoway M660模塊,單片機通過串口發(fā)送AT指令來控制。目前已經(jīng)實現(xiàn)了單條短信接收,接下來想支持一下長短信接收(比如5條連續(xù)內(nèi)容的長短信)。測試了一下,發(fā)給模塊的長短信被分成
    發(fā)表于 05-31 03:53

    長短時記憶網(wǎng)絡(luò)的前向計算

    長短時記憶網(wǎng)絡(luò)長短時記憶網(wǎng)絡(luò)的前向計算長短時記憶網(wǎng)絡(luò)的訓(xùn)練
    發(fā)表于 02-01 07:09

    獨立按鍵長短按的代碼分享

    獨立按鍵長短按的代碼分享
    發(fā)表于 01-20 07:52

    放電時間長短與電池的好壞

    放電時間長短與電池的好壞      目前在電動車電池維修行業(yè)內(nèi),很多人將電池
    發(fā)表于 11-16 14:07 ?4548次閱讀

    基于長短期記憶模型的多維主題模型

    針對中文微博全局性情感傾向分類的準確性不高的問題,提出基于長短期記憶模型的多維主題模型( MT-LSTM)。該模型是一個多層多維序列計算模型,由多維長短期記憶(LSTM)細胞網(wǎng)絡(luò)組成,適用于處理向量
    發(fā)表于 12-14 15:33 ?1次下載
    基于<b class='flag-5'>長短</b>期記憶模型的多維主題模型

    按客戶需求定制長短腳工字電感

    長短腳,通過圖片,可觀察到這款工字電感為長短腳,其中長腳為出線端,短腳為起始端。工字電感長短腳是工字電感生產(chǎn)之前便制作好的,確定長短腳后,再進行電感的繞制。
    發(fā)表于 04-28 14:21 ?783次閱讀

    GCC程序編譯的靜態(tài)鏈接和動態(tài)鏈接

    靜態(tài)鏈接使用靜態(tài)庫進行鏈接,生成的程序包含程序運行所需要的全部庫,可以直接運行,不過靜態(tài)鏈接生成的程序體積較大(即使是在靜態(tài)鏈接中,整個庫文件也并沒有全部裝入到可執(zhí)行文件中,所裝入的只
    的頭像 發(fā)表于 11-12 15:50 ?2547次閱讀
    GCC程序編譯的靜態(tài)<b class='flag-5'>鏈接</b>和動態(tài)<b class='flag-5'>鏈接</b>

    Linux中的軟鏈接、硬鏈接都用在哪些場合?

    最近,看到很多文章都在介紹 Linux 中的文件系統(tǒng),其中就包括:inode 節(jié)點、軟鏈接、硬鏈接等重要的概念。 于是就有小伙伴私信問我:這些概念我都懂,但是我能利用他們來完成什么工作呢? 或者說
    的頭像 發(fā)表于 06-21 16:33 ?1634次閱讀

    長短租公寓無線門鎖解決方案的詳細說明

    長短期出租公寓是一種新型的房屋租賃形式,簡單、方便、快捷。借助互聯(lián)網(wǎng)的宣傳力量,這種住宿模式被很多人所接受。長短期租賃房在全國市場如雨后春筍般涌現(xiàn),并逐漸壯大。 其中,門鎖是最常用的物品,傳統(tǒng)的門鎖
    發(fā)表于 08-02 15:25 ?2023次閱讀

    PyTorch教程之長短期記憶(LSTM)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程之長短期記憶(LSTM).pdf》資料免費下載
    發(fā)表于 06-05 09:51 ?0次下載
    PyTorch教程之<b class='flag-5'>長短</b>期記憶(LSTM)

    鏈接PK軟鏈接

    鏈接PK軟鏈接
    的頭像 發(fā)表于 10-12 18:16 ?1091次閱讀

    鏈接與硬鏈接的區(qū)別

    鏈接又叫符號鏈接,和原文件不是一個文件,類似Windows的快捷方式,如果原始文件被刪除,所有指向它的符號鏈接也就都被破壞了
    的頭像 發(fā)表于 04-19 10:09 ?941次閱讀
    軟<b class='flag-5'>鏈接</b>與硬<b class='flag-5'>鏈接</b>的區(qū)別