最近在做一套推廣系統,將其中涉及的長短鏈接問題在這里分享一下。推廣方式主要是以短信方式慰問客戶并推送宣傳鏈接(非廣告),但鏈接真的是太長了,先不說短信按字數收費問題,就是看到就想立刻刪除。所以組織就安排研究如何讓鏈接變短,精簡干練。
關于長短鏈接
- 長鏈接 :顧名思義,就是網頁的完整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文章
9332瀏覽量
86132 -
ip地址
+關注
關注
0文章
303瀏覽量
17143 -
網頁
+關注
關注
0文章
74瀏覽量
19388
發布評論請先 登錄
相關推薦
一文弄懂Linux硬鏈接和軟鏈接
在Linux系統下,有兩種鏈接文件:一種是硬鏈接(Hard Link);另一種是軟鏈接,也稱為符號鏈接(Symbolic Link)。
發表于 10-21 14:26
?1388次閱讀
請問哪款電子電路設計軟件能實現下面功能?
我在原理圖上把電子元件放在圖紙上并連好線,然后拖動電子元件的同時連線也跟隨元件移動,元件改變位置或方向的時候,連線會自動調整位置和方向以及連線的長短,鏈接屬性不變。不知道應該用哪款設計軟件能實現(簡單好上手的軟件),希望大神們告知一下,謝謝!
發表于 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
基于長短期記憶模型的多維主題模型
針對中文微博全局性情感傾向分類的準確性不高的問題,提出基于長短期記憶模型的多維主題模型( MT-LSTM)。該模型是一個多層多維序列計算模型,由多維長短期記憶(LSTM)細胞網絡組成,適用于處理向量
發表于 12-14 15:33
?1次下載
![基于<b class='flag-5'>長短</b>期記憶模型的多維主題模型](https://file.elecfans.com/web2/M00/49/7E/poYBAGKhwL2AW70iAAAcD64WgVs619.jpg)
按客戶需求定制長短腳工字電感
長短腳,通過圖片,可觀察到這款工字電感為長短腳,其中長腳為出線端,短腳為起始端。工字電感長短腳是工字電感生產之前便制作好的,確定長短腳后,再進行電感的繞制。
發表于 04-28 14:21
?816次閱讀
GCC程序編譯的靜態鏈接和動態鏈接
靜態鏈接使用靜態庫進行鏈接,生成的程序包含程序運行所需要的全部庫,可以直接運行,不過靜態鏈接生成的程序體積較大(即使是在靜態鏈接中,整個庫文件也并沒有全部裝入到可執行文件中,所裝入的只
![GCC程序編譯的靜態<b class='flag-5'>鏈接</b>和動態<b class='flag-5'>鏈接</b>](https://file.elecfans.com/web1/M00/CF/23/o4YBAF-s6BqAF3YnAAAIiC2XiRE417.jpg)
Linux中的軟鏈接、硬鏈接都用在哪些場合?
最近,看到很多文章都在介紹 Linux 中的文件系統,其中就包括:inode 節點、軟鏈接、硬鏈接等重要的概念。 于是就有小伙伴私信問我:這些概念我都懂,但是我能利用他們來完成什么工作呢? 或者說
長短租公寓無線門鎖解決方案的詳細說明
長短期出租公寓是一種新型的房屋租賃形式,簡單、方便、快捷。借助互聯網的宣傳力量,這種住宿模式被很多人所接受。長短期租賃房在全國市場如雨后春筍般涌現,并逐漸壯大。 其中,門鎖是最常用的物品,傳統的門鎖
發表于 08-02 15:25
?2084次閱讀
評論