最近在做一套推廣系統(tǒng),將其中涉及的長(zhǎng)短鏈接問(wèn)題在這里分享一下。推廣方式主要是以短信方式慰問(wèn)客戶并推送宣傳鏈接(非廣告),但鏈接真的是太長(zhǎng)了,先不說(shuō)短信按字?jǐn)?shù)收費(fèi)問(wèn)題,就是看到就想立刻刪除。所以組織就安排研究如何讓鏈接變短,精簡(jiǎn)干練。
關(guān)于長(zhǎng)短鏈接
- 長(zhǎng)鏈接 :顧名思義,就是網(wǎng)頁(yè)的完整URL地址,點(diǎn)擊即可跳轉(zhuǎn)至網(wǎng)頁(yè),進(jìn)行內(nèi)容瀏覽。
- 短鏈接 :就是將長(zhǎng)鏈接進(jìn)行處理后轉(zhuǎn)換成長(zhǎng)度較小的URL地址,如 https://sourl.cn/upNbxj 則是長(zhǎng)鏈接 https://blog.csdn.net/qq_39486758/article/details/126602389 處理之后的結(jié)果。
- 短鏈接相較于長(zhǎng)鏈接,會(huì)更簡(jiǎn)短,便于一些第三方平臺(tái)的字符長(zhǎng)度限制等問(wèn)題處理,當(dāng)然對(duì)于小編來(lái)說(shuō),可以省下不少短信費(fèi)用,能不能“升官發(fā)財(cái)”就靠它了~~
長(zhǎng)短鏈接原理
- 當(dāng)我們?cè)诰W(wǎng)站輸入短鏈接后,DNS會(huì)解析鏈接的ip地址(即 短鏈接服務(wù)器 ),然后DNS轉(zhuǎn)發(fā)請(qǐng)求( HTTP GET )至短鏈接服務(wù)器,通過(guò)短鏈接碼換取對(duì)應(yīng)的 完整URL地址 ,最后短鏈接服務(wù)器通過(guò)請(qǐng)求( HTTP 301 )重定向到完整URL地址,至此完成解析??梢詤⒖紩r(shí)序圖:

注:短鏈接跳轉(zhuǎn)長(zhǎng)鏈接可以采用301(永久重定向),也可以采用302(臨時(shí)重定向),區(qū)別就是對(duì)資源的管理,301會(huì)將舊資源永久移除,替換為重定向的新資源;而302還是會(huì)保留舊資源,只是重定向到新資源,并不會(huì)發(fā)生替換,也不會(huì)保存新資源。
- 自研短鏈接服務(wù) :由于開(kāi)源項(xiàng)目存在不確定性,不得不自己搭建一套短鏈接服務(wù),滿足使用需求。一是便于維護(hù),二是可以靈活擴(kuò)展。接下來(lái)結(jié)合代碼進(jìn)行分析。
- 首先是生成短鏈接碼的算法工具類,算法不是固定的,可以根據(jù)自己習(xí)慣或工作要求使用其它的算法生成,最主要是保證短鏈接碼的唯一性。
/**
* 進(jìn)制轉(zhuǎn)換工具
*/
public class BaseUtil {
// 62進(jìn)制轉(zhuǎn)換率
private static int SCALE_62 = 62;
// 62進(jìn)制,索引位置代表轉(zhuǎn)換字符的數(shù)值 0-61,比如 A代表10,z代表61
private static String CHARS_62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
/**
* 十進(jìn)制數(shù)字轉(zhuǎn)換為62進(jìn)制字符串
* @param value 十進(jìn)制數(shù)字
* @return 62進(jìn)制字符串
*/
public static String encode10to62(long value) {
if (value < 0) {
throw new IllegalArgumentException("參數(shù)非法(必須為非負(fù)數(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進(jìn)制數(shù)字轉(zhuǎn)換為長(zhǎng)度為length的62進(jìn)制字符串
* 原始62進(jìn)制字符串長(zhǎng)度小于length,左側(cè)用‘0’填充補(bǔ)齊
* @param value 十進(jìn)制數(shù)字
* @param length 長(zhǎng)度
* @return 長(zhǎng)度為length或大于length的62進(jìn)制字符串
*/
public static String encode10to62(long value, int length) {
if (length < 1) {
throw new IllegalArgumentException("參數(shù)非法(長(zhǎng)度必須大于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進(jìn)制編碼轉(zhuǎn)換為10進(jìn)制編碼
* @param str62Base 62進(jìn)制編碼
* @return 十進(jìn)制編碼
*/
public static long encode62to10(String str62Base) {
if (str62Base == null || !str62Base.matches("[a-zA-Zd]+")) {
throw new IllegalArgumentException("參數(shù)非法(非62進(jìn)制): " + 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進(jìn)制字符轉(zhuǎn)換成對(duì)應(yīng)十進(jìn)制表示
* @param base62 62進(jìn)制
* @return 十進(jìn)制
*/
private static int base62To10(char base62) {
int value = base62;
// ‘0-9’ 0-9
// ‘0’ ASCII字符代碼表 十進(jìn)制48
// ‘9’ ASCII字符代碼表 十進(jìn)制57
if (value <= 57) value = value - 48;
// ‘A-Z’ 10-35
// ‘A’ ASCII字符代碼表 十進(jìn)制65
// ‘Z’ ASCII字符代碼表 十進(jìn)制90
else if (value <= 90) value = value - 65 + 10;
// ‘a(chǎn)-z’ 36-61
// ‘a(chǎn)’ ASCII字符代碼表 十進(jìn)制97
// ‘Z’ ASCII字符代碼表 十進(jìn)制122
else value = value - 97 + 36;
return value;
}
}
- 然后就是維護(hù)短鏈接的 關(guān)系映射 ,此處小編采用的是集合變量,建議采用Mysql等數(shù)據(jù)庫(kù)將關(guān)系數(shù)據(jù)持久化,避免數(shù)據(jù)丟失,導(dǎo)致訪問(wèn)失敗。
/*
* 短鏈接服務(wù)器地址 根據(jù)自己實(shí)際場(chǎng)景替換
* */
private String domainName = "http://192.168.0.76:8822";
/*
* 短鏈接與長(zhǎng)鏈接映射關(guān)系集合
* */
private Map< Long, String > urlMap = new HashMap< >();
/**
* 長(zhǎng)鏈接編碼成短鏈接
* @param originUrl 原始鏈接(長(zhǎng)鏈接)
* @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èn)短鏈接服務(wù)的接口,完成解析到重定向的處理,至此,短鏈接服務(wù)器完成使命(同時(shí)在處理過(guò)程中可以增加訪問(wèn)記錄等埋點(diǎn)操作)。
/**
* 解碼重定向
*
* @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);
}
- 模擬操作過(guò)程:本地啟動(dòng)短鏈接服務(wù),再啟動(dòng)一個(gè)業(yè)務(wù)服務(wù)作為長(zhǎng)鏈接服務(wù),將長(zhǎng)鏈接生成短鏈接,然后訪問(wèn)短鏈接并成功跳轉(zhuǎn)至長(zhǎng)鏈接地址。演示結(jié)果



總結(jié)
- 以上就是本文所分享的全部?jī)?nèi)容,當(dāng)然不止這一種實(shí)現(xiàn)方式,有想法的小伙伴可以私信探討。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
服務(wù)器
+關(guān)注
關(guān)注
14文章
10177瀏覽量
91241 -
ip地址
+關(guān)注
關(guān)注
0文章
309瀏覽量
18892 -
網(wǎng)頁(yè)
+關(guān)注
關(guān)注
0文章
75瀏覽量
19824
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
一文弄懂Linux硬鏈接和軟鏈接
在Linux系統(tǒng)下,有兩種鏈接文件:一種是硬鏈接(Hard Link);另一種是軟鏈接,也稱為符號(hào)鏈接(Symbolic Link)。
發(fā)表于 10-21 14:26
?1688次閱讀
請(qǐng)問(wèn)哪款電子電路設(shè)計(jì)軟件能實(shí)現(xiàn)下面功能?
我在原理圖上把電子元件放在圖紙上并連好線,然后拖動(dòng)電子元件的同時(shí)連線也跟隨元件移動(dòng),元件改變位置或方向的時(shí)候,連線會(huì)自動(dòng)調(diào)整位置和方向以及連線的長(zhǎng)短,鏈接屬性不變。不知道應(yīng)該用哪款設(shè)計(jì)軟件能實(shí)現(xiàn)(簡(jiǎn)單好上手的軟件),希望大神們告知一下,謝謝!
發(fā)表于 02-28 16:51
WAVECOM CDMA MODEM開(kāi)發(fā)包 C#CDMA短信開(kāi)發(fā)包 長(zhǎng)短信
信控件,長(zhǎng)短信發(fā)送軟件,短信數(shù)據(jù)庫(kù)接口COM組件短信貓開(kāi)發(fā)包|SDK、API開(kāi)發(fā)包|16進(jìn)制短信|超長(zhǎng)短信編碼DELPHI短信接口| DLL動(dòng)態(tài)鏈接庫(kù)API|短信控件OCX| SDK開(kāi)發(fā)包聯(lián)移GSM
發(fā)表于 07-23 09:08
請(qǐng)問(wèn)怎么設(shè)置GSM模塊使其支持長(zhǎng)短信接收?
項(xiàng)目使用有方公司Neoway M660模塊,單片機(jī)通過(guò)串口發(fā)送AT指令來(lái)控制。目前已經(jīng)實(shí)現(xiàn)了單條短信接收,接下來(lái)想支持一下長(zhǎng)短信接收(比如5條連續(xù)內(nèi)容的長(zhǎng)短信)。測(cè)試了一下,發(fā)給模塊的長(zhǎng)短信被分成
發(fā)表于 05-31 03:53
長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)的前向計(jì)算
長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)的前向計(jì)算長(zhǎng)短時(shí)記憶網(wǎng)絡(luò)的訓(xùn)練
發(fā)表于 02-01 07:09
放電時(shí)間長(zhǎng)短與電池的好壞
放電時(shí)間長(zhǎng)短與電池的好壞
目前在電動(dòng)車電池維修行業(yè)內(nèi),很多人將電池
發(fā)表于 11-16 14:07
?4835次閱讀
基于長(zhǎng)短期記憶模型的多維主題模型
針對(duì)中文微博全局性情感傾向分類的準(zhǔn)確性不高的問(wèn)題,提出基于長(zhǎng)短期記憶模型的多維主題模型( MT-LSTM)。該模型是一個(gè)多層多維序列計(jì)算模型,由多維長(zhǎng)短期記憶(LSTM)細(xì)胞網(wǎng)絡(luò)組成,適用于處理向量
發(fā)表于 12-14 15:33
?1次下載
按客戶需求定制長(zhǎng)短腳工字電感
長(zhǎng)短腳,通過(guò)圖片,可觀察到這款工字電感為長(zhǎng)短腳,其中長(zhǎng)腳為出線端,短腳為起始端。工字電感長(zhǎng)短腳是工字電感生產(chǎn)之前便制作好的,確定長(zhǎng)短腳后,再進(jìn)行電感的繞制。
發(fā)表于 04-28 14:21
?1054次閱讀
GCC程序編譯的靜態(tài)鏈接和動(dòng)態(tài)鏈接
靜態(tài)鏈接使用靜態(tài)庫(kù)進(jìn)行鏈接,生成的程序包含程序運(yùn)行所需要的全部庫(kù),可以直接運(yùn)行,不過(guò)靜態(tài)鏈接生成的程序體積較大(即使是在靜態(tài)鏈接中,整個(gè)庫(kù)文件也并沒(méi)有全部裝入到可執(zhí)行文件中,所裝入的只
Linux中的軟鏈接、硬鏈接都用在哪些場(chǎng)合?
最近,看到很多文章都在介紹 Linux 中的文件系統(tǒng),其中就包括:inode 節(jié)點(diǎn)、軟鏈接、硬鏈接等重要的概念。 于是就有小伙伴私信問(wèn)我:這些概念我都懂,但是我能利用他們來(lái)完成什么工作呢? 或者說(shuō)
長(zhǎng)短租公寓無(wú)線門鎖解決方案的詳細(xì)說(shuō)明
長(zhǎng)短期出租公寓是一種新型的房屋租賃形式,簡(jiǎn)單、方便、快捷。借助互聯(lián)網(wǎng)的宣傳力量,這種住宿模式被很多人所接受。長(zhǎng)短期租賃房在全國(guó)市場(chǎng)如雨后春筍般涌現(xiàn),并逐漸壯大。 其中,門鎖是最常用的物品,傳統(tǒng)的門鎖
發(fā)表于 08-02 15:25
?2414次閱讀
PyTorch教程之長(zhǎng)短期記憶(LSTM)
電子發(fā)燒友網(wǎng)站提供《PyTorch教程之長(zhǎng)短期記憶(LSTM).pdf》資料免費(fèi)下載
發(fā)表于 06-05 09:51
?0次下載
長(zhǎng)短鏈接原理案例
評(píng)論