有时候,我们不想采用很长的url链接,主要的一些原因:

  1. URL太长占显示空间、难于输入,转成二维码点点小,难于识别
  2. 长的URL提供的信息太多,不利于信息安全,甚至容易造成倒库
  3. 其他理由......例如强迫症

今天的理由不是重点,重点是如何用一点点代码实现这个短链接的生成。

注意点:

  1. 生成的短链接地址长度可调整,毕竟不能因为4位、5位、6位的长度变化就让我们重新写一套程序
  2. 要有防冲突处理机制,不能因为算法导致两个长链接地址生成的短地址一样就把前一个覆盖掉
  3. 有时候,一个地址用过之后觉得不需要使用了,哪么这个地址失效之后,短地址可以有效收回。

首先设计接口

public interface UrlShortener {/*** 设置产生短链接长度* @param length* @return*/void setLength(int length);/*** 返回短链接长度* @return*/int getLength();/*** 返回指定地址对应的短链接* @param url* @return*/String get(String url);/*** 存储对应关系* @param url* @param shortUrl*/void put(String url, String shortUrl);/*** 到库里查看是不是存在映射,如果不存在返回null* @param shortUrl* @return*/String seek(String shortUrl);/*** 据地址产生短地址* @param url* @return*/String generate(String url);/*** 根据地址和种子产生一个短地址* @param url* @param seed* @return*/String generate(String url, int seed);/*** 清除指定URL的短链接信息* @param url*/void clean(String url);/*** 清除指定时间以前没有使用的所有短链接* @param date*/void clean(Date date);
}

只是个示例,注释比较简陋,接下来是抽象类实现,把公共的内容放这里

public abstract class AbstractUrlShortener implements UrlShortener {public static char[] VALID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".toCharArray();private static Random random = new Random(System.currentTimeMillis());protected int length = 4;public AbstractUrlShortener() {}public AbstractUrlShortener(int length) {this.length = length;}public void setLength(int length) {this.length = length;}public int getLength() {return length;}public String get(String url) {String sortUrl = seek(url);if (sortUrl == null) {sortUrl = generate(url);put(url, sortUrl);}return sortUrl;}public String generate(String url, int seed) {char[] sortUrl = new char[length];for (int i = 0; i < length; i++) {sortUrl[i] = VALID_CHARS[seed % VALID_CHARS.length];seed = random.nextInt(Integer.MAX_VALUE) % VALID_CHARS.length;}return new String(sortUrl);}public String generate(String url) {String shortUrl;shortUrl = generate(url, random.nextInt(Integer.MAX_VALUE));while (seek(shortUrl) != null) {shortUrl = generate(url, random.nextInt(Integer.MAX_VALUE));}put(url, shortUrl);return shortUrl;}}

实际的需要在数据库层实现,这里在内存里面存储的实现一个意思一下

import java.util.Date;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** 内存存储的实现*/
public class UrlShortenerMemory extends AbstractUrlShortener {private Map<String, String> url2ShortUrl = new ConcurrentHashMap<String, String>();private Map<String, String> shortUrl2Url = new ConcurrentHashMap<String, String>();public UrlShortenerMemory() {super();}public UrlShortenerMemory(int length) {super(length);}public void put(String url, String shortUrl) {url2ShortUrl.put(url, shortUrl);shortUrl2Url.put(shortUrl, url);}public String seek(String shortUrl) {return shortUrl2Url.get(shortUrl);}public void clean(String url) {String sortUrl = url2ShortUrl.get(url);if (sortUrl != null) {url2ShortUrl.remove(url);shortUrl2Url.remove(sortUrl);}}public void clean(Date date) {throw new UnsupportedOperationException();}}

弄点测试代码,试试看效果怎么样

public class UrlShortenerTest {public static void main(String[] args) {for(int j=1;j<10;j++) {UrlShortener urlShortener = new UrlShortenerMemory(j);for (int i = 0; i < 5; i++) {System.out.println(urlShortener.get("http://www.tinygroup.org"));}System.out.println();}}
}

这里是运行结果

T
Q
l
i
I0R
VB
fN
so
Nwfw1
fpu
WT7
pNL
M5V0cZF
H09A
AjYM
1AMf
sdkzUSsgK
ZMn9U
7S48u
oBb1L
yB14gDRVGWg
gh3oJa
BapdY7
yJgcZj
mivGN3TEiQG2M
8SkokOY
NZww5GT
fxloZ0R
hkiOpID3ZpdIYrF
eFlSSDyd
bB4RCFgE
25mceTMK
AAJ2Lp6S5IUVoFSqZ
zHZeuZljY
njCGDBKVs
IgH21Tg5V
WvGCy5ZtE

感觉还可以,当然里面还有一些不完善的地方

  1. 当产生的数量达到一定程度的时候,再获取时由于冲突比较大,导致性能会降低
  2. 因此如果是小型系统,建议采用4个长度,大型系统建议采用6个长度
  3. 现在还没有多长时间之后自动失效的API,建议添加
  4. 需要实现支持序列化的方案
  5. 现在没有同步处理,实际实现中需要考虑

这个只是化几分钟展示一个思路,并没有经过系统的思考的验证,正式系统请慎重使用。

【Java】接口长URL转成短连接的实现(代码案例实操)相关推荐

  1. php将长url转成短链接,php将URL长链接转换短链接的两种方法

    短网址(Short URL) ,顾名思义就是在形式上比较短的网址.在Web 2.0的今天,不得不说,这是一个潮流.目前已经有许多类似服务,借助短网址您可以用简短的网址替代原来冗长的网址,让使用者可以更 ...

  2. 长URL链接转短链接算法

    引言 很多大型网站都加入了短链接的功能.之所以要是使用短链接,主要是因为微博只允许发140 字,如果链接地址太长的话,那么发送的字数将大大减少.短链接的主要职责就是把原始链接很长的地址压缩成只有6 个 ...

  3. php微信短网址生成,如何把微信文章网址长连接(长网址)转换为短连接(短网址)...

    为什么要把长连接转为短连接? 1.专业一点:长连接不利于网站的SEO,链接越长权重越低: 2.通俗一点:链接越长越不利于网络传播,不利于推广,更严重的是有些网站会把长网址屏蔽掉. 3.另外有些平台的内 ...

  4. 带地址参数的长链接转换成短链接分享

    项目中的长链接中有二维码的地址,二维码的地址中又有用户的参数,出现了两个?,分享出去很不好看还有问题,使用了新浪等的长链接转短链接总会截断第二个问号后的数据. 我自己去网站扒了一个长链接转短链接的接口 ...

  5. SpringBoot-生成短链接(长链接转换成短链接-百度短网址)

    采用Google工具类 一.引入jar <dependency> <groupId>com.google.code.gson</groupId> <artif ...

  6. 长链接转成短链接的原理和实现详解

    一.为什么要设计短链接,短链接有什么好处? 1.链接变短,在对内容长度有限制的平台发文,可编辑的文字就变多了. 比如:微博,限定了只能发 140 个字,如果一串长链直接怼上去,其他可编辑的内容就所剩无 ...

  7. 怎样把长视频分割成短视频?视频剪辑方法分享

    怎么剪辑视频,比如说将多段长视频分割成几段短视频保存呢?今天小编给大家分享一个新的剪辑技巧,它支持多段视频的同时剪辑,下面一起来试试吧. 所需工具 视频素材若干 操作步骤 打开[媒体梦工厂],在&qu ...

  8. excel 2种方法将长日期修改成短日期

    朋友给我扔过来一个表格,如图,想把时间分列. 为什么分列?因为只想要年月日,不要时分秒. 这还不简单,直接修改格式为短日期不就好了? 一番操作之后发现,啥也不是~ 当双击表中时间单元格然后回车,或者再 ...

  9. php长字符加密成短字符,大神们 怎么把一串长的字符串加密为短的能还原

    大神们怎么把很长的字符串加密为短字符不乱码       且能还原    菜鸟求教          例如这个求教了"FFD8FFE000104A46494600010200000100010 ...

最新文章

  1. 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他...
  2. 从产品的适用性以及费用方面考虑
  3. 奥比中光Astra深度传感器工作原理
  4. GO语言教程1:Linux--debian/ubuntu下Go语言的安装
  5. discuz7记录下url静态化的apache2.2配置
  6. for、while循环及其变体
  7. MPP 二、Greenplum数据加载
  8. 有幸见到一朵花的绽放
  9. ssas 数据源mysql_BI之SSAS完整实战教程2 -- 开发环境介绍及多维数据集数据源准备...
  10. vue 模板 html 表达式,Vue 模板template、指令directive、修饰符
  11. uefi windows10 linux,UEFI 启动GPT分区 Win10和Ubuntu16.04双系统安装
  12. Frame buffer分析 - fbmem.c【转】
  13. 1.1 经典车间生产调度问题模型及其算法
  14. excel自动求和_Excel教程:3个按条件定位的小技巧
  15. UEFI Shell编程和使用
  16. 不在被虐中成长就在被虐中死亡
  17. php 检测分辨率,浏览器分辨率检测,屏幕分辨率检测
  18. Spring Cloud OAuth2中访问/oauth/token报Unsupported grant type: password问题的解决
  19. Java SE 部分基础知识
  20. 高德地图在H5页面中的使用(VUE)

热门文章

  1. 北京移动CM311-5s-ZG_GK6323V100C_2+8_免拆一键卡刷固件包
  2. JAVA获取本地字库
  3. 微信资料在电脑上怎么打印?
  4. kylin-1.6.0单节点安装
  5. 20N20-ASEMI低功耗场效应管20A 200V
  6. JSP基于SSH2网上数码购物商城设计
  7. 2022G1工业锅炉司炉复训题库模拟考试平台操作
  8. 深度学习基础入门篇[五]:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测
  9. AI和IoT的新时代:告别独自美好,迎接双向奔赴
  10. 2022-算法设计与分析-实验6-数据结构、字符串