百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

URL缩短器:详细说明(企业应收账款越少越好吗)

bigegpt 2025-03-24 14:13 7 浏览

介绍

URL缩短器是一种用于从非常长的URL创建短链接的服务。通常,短链接的大小是原始URL的三分之一甚至四分之一,这使得它们更易于键入,呈现或发布。单击短链接用户将自动重定向到原始URL。

在线提供许多URL缩短服务,例如tiny.cc,bitly.com,cutt.ly等。实现URL缩短服务并不是一项复杂的任务,并且通常是系统设计方面的一部分。在这篇文章中,我将尝试解释实现服务的过程。

理论

在实施之前,最好以功能和非功能需求的形式分清楚需要完成的工作。

功能要求:

  • 用户需要能够输入长网址。我们的服务应保存该URL并生成一个短链接
  • 用户应该可以选择输入到期日期。在该日期之后,短链接应无效
  • 单击短链接应将用户重定向到原始长URL
  • 用户应创建一个帐户以使用服务。服务可以有每个用户的使用限制*
  • 允许用户创建自己的短链接*
  • 服务应具有指标,例如访问最多的链接*

非功能需求:

  • 服务应已启动并正在运行100%的时间
  • 重定向的时间不应超过两秒

网址转换

假设我们要有一个最大长度为7的短链接。URL缩短器中最重要的是转换算法。URL转换可以通过几种不同的方式实现,每种方式各有利弊。

生成短链接的一种方法是使用某种哈希函数(例如MD5 或SHA-2)哈希原始URL 。使用哈希函数时,请确保不同的输入将导致不同的输出。哈希的结果超过七个字符,因此我们需要获取前七个字符。但是,在这种情况下,可能会发生冲突,因为前七个字符可能已经用作短链接。然后,我们接下来的七个字符,直到找到未使用的短链接。

生成短链接的第二种方法是使用UUID。UUID将被复制的概率不为零,但它足够接近零而可以忽略不计。由于UUID包含36个字符,这意味着我们遇到了与上述相同的问题。我们应该采用前七个字符,并检查该组合是否已被使用。

第三种方式是将数字从基数10转换为基数62。基数是可用于表示特定数字的许多数字或字符。以10为基数的数字是[0-9],我们在日常生活中使用的数字是以0为基数的数字[0-9] [az] [AZ]。这意味着,例如,以10为底的四位数数字将以以62为底的相同数字,但带有两个字符。

在URL转换中使用基数62,最大长度为7个字符,这使我们可以为短链接提供62 ^ 7个唯一值。

Base 62转换如何工作

我们有一个以10为底的数字,我们想要转换以62为底的数字。我们将使用以下算法:

while(number > 0)
    remainder = number % 62
    number = number / 62
    //将余数附加到结果收集的开始

之后,我们只需要将结果集中的数字映射到以62为基础的字母= [0,1,2,...,a,b,c ...,A,B,C,...]。

让我们用一个真实的例子看看它是如何工作的。在此示例中,让我们将1000从10转换为62。

1st iteration:
    number = 1000
    remainder = 1000 % 62 = 8
    number = 1000 / 62 = 16
    result list = [8]
2nd iteration:
    number = 16
    remainder = 16 % 62 = 16
    number = 16 / 62 = 0
    result list = [16,8]
There is no more iterations since number = 0 after 2nd iteration

将[16,8]映射到基数62将是g8。这意味着1000 base10 = g8 base62。

从基础62转换为基础10也很简单:

i = 0
while(i < inputString lenght)
    counter = i + 1
    mapped = base62alphabet.indexOf(inputString[i]) 
    //根据字母索引将字符映射到数字
    result = result + mapped * 62^(inputString lenght - counter)
    i++

真实的例子:

inputString = g8
inputString length = 2
i = 0
result = 0
1st iteration 
    counter = 1
    mapped = 16 // base62alphabet中g的索引是16
    result = 0 + 16 * 62^1 = 992
2nd iteration
    counter = 2
    mapped = 8 // base62alphabet中8的索引是8
    result = 992 + 8 * 62^1 = 1000

实作

我将使用数据库的自动增量功能。自动递增的数字将用于以62为基数的转换。也可以使用任何其他具有自动增量功能的数据库。

首先,访问Spring初始化程序,然后选择Spring Web和MySql Driver。之后,单击“ 生成”按钮,然后下载zip文件。解压缩文件,然后在您喜欢的IDE中打开项目。每次启动新项目时,我都喜欢创建一些文件夹来按逻辑划分代码。在这种情况下,我的文件夹是controller,entity,service,repository,dto和config。

里面的实体文件夹,让我们创建一个Url.java有四个属性类:id,longUrl,createdDate,expiresDate。

请注意,没有短链接属性。每当有GET请求时,我们就将id属性从10转换为62。这样,我们可以节省数据库空间。

该LongUrl属性是我们应该重定向到当一个用户访问一个短链接的URL。创建日期仅用于查看longUrl保存的时间(这并不重要),expiresDate如果用户希望在一段时间后使短链接不可用,则创建日期在此处。

接下来,让我们在服务文件夹中创建BaseService.java。包含从10转换为62的方法,反之亦然。

private static final String allowedString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private char[] allowedCharacters = allowedString.toCharArray();
private int base = allowedCharacters.length;

就像我之前提到的,如果要使用基数为62的转换,则需要有一个基数为62的字母,在这种情况下称为allowedCharacters。另外,base如果我们要更改允许的字符,则从允许的字符的长度计算出变量的值。

该encode方法以数字作为输入并返回短链接。该decode方法将字符串(短链接)作为输入并返回数字。该算法应按照上面的说明进行实施。

然后,在存储库文件夹中,创建一个UrlRepository.java文件,该文件只是的扩展JpaRepository。它为我们提供了很多方法,例如findById,save等。我们无需为此添加任何其他内容。

然后,让我们在controller文件夹中创建一个UrlController.java文件。控制器应具有一种用于创建短链接的POST方法和一种用于重定向至原始URL的GET方法。

@PostMapping("create-short")
public String convertToShortUrl(@RequestBody UrlLongRequest request) {
    return urlService.convertToShortUrl(request);
}
@GetMapping(value = "{shortUrl}")
public ResponseEntity getAndRedirect(@PathVariable String shortUrl) {
    var url = urlService.getOriginalUrl(shortUrl);
    return ResponseEntity.status(HttpStatus.FOUND)
            .location(URI.create(url))
            .build();
}

POST方法将UrlLongRequest作为其请求正文。它只是具有longUrl和expiresDate属性的类。

GET方法将短URL作为路径变量,然后获取并重定向到原始URL。在控制器的顶部,作为依赖项UrlService 被注入,接下来将对其进行说明。

UrlService.java是大多数逻辑所在的位置,并且是控制器使用的服务。ConvertToShortUrl由控制器的POST方法使用。它只是在数据库中创建一条新记录并获取一个ID。然后将该id转换为以62为基础的短链接,并返回给控制器。

GetOriginalUrl是控制器的GET方法使用的方法。它首先将字符串转换为以10为底的字符串,其结果是一个id。然后,它通过该ID从数据库中获取一条记录,如果不存在则抛出异常。之后,它将原始URL返回给控制器。

结论

URL缩短服务是一种简单的服务,它需要较长的URL并将其转换为短链接。访问该链接后,用户将被重定向到原始URL。

相关推荐

得物可观测平台架构升级:基于GreptimeDB的全新监控体系实践

一、摘要在前端可观测分析场景中,需要实时观测并处理多地、多环境的运行情况,以保障Web应用和移动端的可用性与性能。传统方案往往依赖代理Agent→消息队列→流计算引擎→OLAP存储...

warm-flow新春版:网关直连和流程图重构

本期主要解决了网关直连和流程图重构,可以自此之后可支持各种复杂的网关混合、多网关直连使用。-新增Ruoyi-Vue-Plus优秀开源集成案例更新日志[feat]导入、导出和保存等新增json格式支持...

扣子空间体验报告

在数字化时代,智能工具的应用正不断拓展到我们工作和生活的各个角落。从任务规划到项目执行,再到任务管理,作者深入探讨了这款工具在不同场景下的表现和潜力。通过具体的应用实例,文章展示了扣子空间如何帮助用户...

spider-flow:开源的可视化方式定义爬虫方案

spider-flow简介spider-flow是一个爬虫平台,以可视化推拽方式定义爬取流程,无需代码即可实现一个爬虫服务。spider-flow特性支持css选择器、正则提取支持JSON/XML格式...

solon-flow 你好世界!

solon-flow是一个基础级的流处理引擎(可用于业务规则、决策处理、计算编排、流程审批等......)。提供有“开放式”驱动定制支持,像jdbc有mysql或pgsql等驱动,可...

新一代开源爬虫平台:SpiderFlow

SpiderFlow:新一代爬虫平台,以图形化方式定义爬虫流程,不写代码即可完成爬虫。-精选真开源,释放新价值。概览Spider-Flow是一个开源的、面向所有用户的Web端爬虫构建平台,它使用Ja...

通过 SQL 训练机器学习模型的引擎

关注薪资待遇的同学应该知道,机器学习相关的岗位工资普遍偏高啊。同时随着各种通用机器学习框架的出现,机器学习的门槛也在逐渐降低,训练一个简单的机器学习模型变得不那么难。但是不得不承认对于一些数据相关的工...

鼠须管输入法rime for Mac

鼠须管输入法forMac是一款十分新颖的跨平台输入法软件,全名是中州韵输入法引擎,鼠须管输入法mac版不仅仅是一个输入法,而是一个输入法算法框架。Rime的基础架构十分精良,一套算法支持了拼音、...

Go语言 1.20 版本正式发布:新版详细介绍

Go1.20简介最新的Go版本1.20在Go1.19发布六个月后发布。它的大部分更改都在工具链、运行时和库的实现中。一如既往,该版本保持了Go1的兼容性承诺。我们期望几乎所...

iOS 10平台SpriteKit新特性之Tile Maps(上)

简介苹果公司在WWDC2016大会上向人们展示了一大批新的好东西。其中之一就是SpriteKitTileEditor。这款工具易于上手,而且看起来速度特别快。在本教程中,你将了解关于TileE...

程序员简历例句—范例Java、Python、C++模板

个人简介通用简介:有良好的代码风格,通过添加注释提高代码可读性,注重代码质量,研读过XXX,XXX等多个开源项目源码从而学习增强代码的健壮性与扩展性。具备良好的代码编程习惯及文档编写能力,参与多个高...

Telerik UI for iOS Q3 2015正式发布

近日,TelerikUIforiOS正式发布了Q32015。新版本新增对XCode7、Swift2.0和iOS9的支持,同时还新增了对数轴、不连续的日期时间轴等;改进TKDataPoin...

ios使用ijkplayer+nginx进行视频直播

上两节,我们讲到使用nginx和ngixn的rtmp模块搭建直播的服务器,接着我们讲解了在Android使用ijkplayer来作为我们的视频直播播放器,整个过程中,需要注意的就是ijlplayer编...

IOS技术分享|iOS快速生成开发文档(一)

前言对于开发人员而言,文档的作用不言而喻。文档不仅可以提高软件开发效率,还能便于以后的软件开发、使用和维护。本文主要讲述Objective-C快速生成开发文档工具appledoc。简介apple...

macOS下配置VS Code C++开发环境

本文介绍在苹果macOS操作系统下,配置VisualStudioCode的C/C++开发环境的过程,本环境使用Clang/LLVM编译器和调试器。一、前置条件本文默认前置条件是,您的开发设备已...