最近在做一套推广系统,将其中涉及的长短链接问题在这里分享一下。推广方式主要是以短信方式慰问客户并推送宣传链接(非广告),但链接真的是太长了,先不说短信按字数收费问题,就是看到就想立刻删除。所以组织就安排研究如何让链接变短,精简干练。
关于长短链接
长链接 :顾名思义,就是网页的完整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 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 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); }模拟操作过程:本地启动短链接服务,再启动一个业务服务作为长链接服务,将长链接生成短链接,然后访问短链接并成功跳转至长链接地址。演示结果
总结以上就是本文所分享的全部内容,当然不止这一种实现方式,有想法的小伙伴可以私信探讨。
Vivado设计套件的快速入门视频辅导资料
2017苹果开发者大会有什么期待的?6大看点抢先看
用ZDS08测量接触网触发拍照方案
采用3D轮廓分析检测提升PCBA良率
臭氧检测仪品牌
长短链接原理案例
投影网红极米业务集中度高 核心专利受制国外
智能汽车中车用电子封装技术发展
为什么欧美市场的一些二手iPhone手机通过香港输入内地?
物联网导致了互联网大势已去了吗
瑞莱智慧获“隐私计算卓越者-精益融合者”荣誉
【凡亿疯狂星期五】微波集成芯片(MMIC)设计实战
我国智能交通发展还有什么瓶颈需要解决
解析完成计算差分阻抗的过程
控制按钮的结构和符号_控制按钮的分类
浅析奔驰AMG的混动和纯电系统
在线空气环境监测系统是什么,有哪些特点
2023年12月储能项目开工建设,规模达2258.7MW/6519MWh
日本OLED面板供应商JOLED设立JOLED能美事业所
索尼全新两款XPeria全新上线,配置外形曝光!索尼只给全中国的手机和iphone供应摄像头,其他的全都pass?