短链接的原理
通过将长的URL地址转换成较短的一段字符或数字组合,使得用户更方便地记忆和分享链接。这种转换过程需要借助短链接服务商提供的服务,通常是将长链接压缩成一个短的地址,然后在访问该地址时,将其重定向到原始的长链接地址。
一般来说,短链接服务商会将长链接转换成一个短的、易于记忆的字符串或数字组合,如"bit.ly/abc123",然后在访问该地址时,将其重定向到原始的长链接地址,如"https://www.example.com/some/long/path/to/a/resource". 这个过程需要短链接服务商的支持,因为只有它们能
短链接的转换方法有很多种,其中一种常用的方法是基于哈希算法,将长链接映射为短的字符串或数字。下面是一个简单的哈希算法示例:
- 将长链接进行哈希,得到一个固定长度的哈希值。
- 将哈希值转换为一个短的字符串或数字,例如将十进制的哈希值转换为 62 进制表示,使用数字和大小写字母来表示短链接。
- 将短链接存储在数据库中,并将其与原始的长链接地址进行关联。
- 当用户访问短链接时,将其重定向到关联的原始长链接地址。
另一种常用的方法是使用自增序列生成短链接,例如将自增的数字转换为 62 进制表示的字符串作为短链接。这种方法的缺点是容易被猜测和破解,因此需要添加一些防范措施,例如在生成短链接时添加随机因素。够将长链接转换成短链接,并提供重定向服务。
当访问一个短链接时,服务器会将访问请求重定向到该短链接所对应的原始长链接地址。这个重定向过程的具体实现是通过HTTP协议中的重定向机制来实现的。具体来说,当浏览器访问一个短链接时,服务器会返回一个HTTP 301或302状态码,告诉浏览器需要重定向到另一个URL地址。浏览器收到这个响应后,会根据重定向的URL地址发出新的请求,进而访问该短链接所对应的原始长链接地址。
例如,当访问短链接 http://bit.ly/2O6jDz6 时,服务器会返回一个HTTP 301状态码,并告诉浏览器需要重定向到原始长链接地址 https://www.example.com/article/123456 。浏览器会根据这个重定向地址,发出新的HTTP请求,访问该原始长链接地址。
总的来说,短链接的还原是通过HTTP协议中的重定向机制来实现的。
短链接的下载过程:
- 用户在浏览器或其他应用程序中输入短链接,发起访问请求。
- 服务器收到访问请求后,会将请求重定向到短链接对应的原始长链接地址。
- 浏览器或其他应用程序收到重定向响应后,会重新发起访问请求,获取原始长链接地址对应的内容
//短链接处理 void DownloadController:: shortLink(const QString& url) { m_Url = QUrl(url); if(m_Url.scheme() == QLatin1String("https") || m_Url.scheme() == QLatin1String("http")){ QNetworkAccessManager manager; QNetworkRequest request(m_Url); for(int i=0;i<3;i++) { //发出请求,获取目标地址的头部信息 QNetworkReply *reply = manager.head(QNetworkRequest(m_Url)); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()), Qt::DirectConnection); loop.exec(); QVariant possibleRedirectUrl = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); if(!possibleRedirectUrl.isNull()) { QUrl redirectUrl = possibleRedirectUrl.toUrl(); if(redirectUrl.isRelative()) { QUrl originalUrl = reply->request().url(); redirectUrl = originalUrl.resolved(redirectUrl); } // 重定向后的 URL //qDebug() << "Redirection Target: " << redirectUrl.toString(); m_Url=redirectUrl; } else break; } } }