Разговор о коротких адресах и их принципах

задняя часть Микросервисы
Разговор о коротких адресах и их принципах

Введение

Коллега столкнулся с проблемой, он сказал, что он ограничен сторонним сервисом, а строка, которую он привел в запросе, слишком длинная для получения информации от стороннего сервиса, что очень огорчило😴. Позже мы обсудили это и, наконец, решили проблему, обратившись к идее короткого адреса. Причина очень проста, потому что сторонний сервис дополнительной строковой информации в нашем запросе просто прозрачно передает нам обратно, нам нужно только сжать символы этой дополнительной информации, чтобы длина строки, приносимой запрос соответствует требованиям😊 .

Пишу ли статьи или делаю какие-то формы, я часто использую короткие адреса. Преимущество короткого адреса в том, что он короткий (меньше символов), лаконичный, удобный для написания и не занимает места. Удобно делиться ссылками и размещать рекламу в социальных сетях и на сторонних площадках. Например, некоторые люди будут указывать короткий адрес при отправке кругу друзей, а некоторые маркетинговые текстовые сообщения также будут содержать ссылки на короткие адреса.

Существуют готовые генераторы коротких адресов, и часто используемые преобразования коротких адресовПреобразование короткого URL-адреса Baidu,Преобразование короткого URL-адреса Googleа такжеПреобразование коротких адресов Sina, К сожалению, Google закрыл сервис, официальное заявление выглядит следующим образом:

On March 30, 2018, we turned down support for goo.gl URL shortener. 
From April 13, 2018, only existing users were able to create short links on the goo.gl console.
Analytics data was available for up to one year, until March 30, 2019, when goo.gl was discontinued. 
Previously created links will continue to redirect to their intended destination. 
Please see this blog post for more details.

Я часто пользуюсь сервисом коротких адресов Baidu. Это самый быстрый доступ к нему, который может удовлетворить мои потребности в работе и учебе. Он также предоставляет услуги API для справки.Документация по интерфейсу генерации коротких URLУчиться и понимать.

Давайте сначала посмотрим на эти перенаправления в протоколе HTTP.

Перенаправление HTTP-запроса

в HTTP301,302,303,307,308Коды состояния ответа, все из которых указывают на перенаправленные ответы.

в,301,308Код состояния ответа указывает на постоянное перенаправление,302,303,307Указывает на временное перенаправление.

Итак, давайте поговорим о том, что такое перенаправление?

Перенаправление — это перенаправление различных сетевых запросов в другие местоположения с помощью различных методов (таких как перенаправление веб-страницы, перенаправление доменного имени и изменения маршрутизации, которые также сильно влияют на путь пакетов данных. Ориентация).

Например, вы собираетесь подать заявку на сертификат в отдел А. После того, как вы идете, кто-то в отделе А говорит вам, что они больше не принимают это дело, и вам нужно пойти в отдел Б, чтобы подать заявку на это, и тогда вы идете в отдел Б самостоятельно. Этот процесс аналогичен перенаправлению.

Затем эти коды состояния ответа 30X, определенные в протоколе HTTP, похожи наA部门的某人Они говорят клиенту, что вам нужно получить доступ к другому адресу.

Перенаправление делает два HTTP-запроса.В первый раз клиент запрашивает сервер A, а ответ A сообщает браузеру, что вы должны перейти на сервер B для посещения. В этот момент перейдите на сервер B. В это время вы можете видеть, что URL-адрес в браузере изменился, Это второй HTTP-запрос.

Процесс перенаправления:

Шаг 1. Браузер (клиент) отправляет HTTP-запрос;

Шаг 2, веб-сервер А отправляет после получения302Ответ с кодом состояния и поместите соответствующий в заголовок ответаLocationв браузер;

Шаг 3, браузер получает ответ, возвращенный сервером.302код ответа, автоматически отправляется новый HTTP-запрос (URL-адрес запроса новыйLocationадрес в);

Шаг 4. Веб-сервер (может быть А или другие серверы) находит ресурс по этому запросу и отправляет его в браузер, и, наконец, показывает его пользователю.

оLocationВы можете увидеть скриншот ниже (это пример перенаправленного HTTP-запроса), он размещен в заголовке ответа, а его значение — это URL-адрес, который необходимо перенаправить.http://www.veryitman.com, из этого процесса видно, что перенаправление — это клиентское (браузерное) поведение.

在这里插入图片描述
Существует также технология, называемая переадресацией. Это отличается от перенаправления. Переадресация — это поведение сервера. Возьмем в качестве примера вышеприведенный пример отдела А. Вы должны пойти в отдел А, чтобы подать заявку на сертификат. Люди говорят вам, что они не дольше заниматься этим вопросом, но отдел А может координировать ресурсы, чтобы помочь вам сделать это без необходимости обращаться к другим отделам для решения этой проблемы. Этот процесс аналогичен пересылке.

Имитация перенаправления

Теперь используйте SpringBoot для имитации перенаправления, я использую SpringBoot2.2.0.RELEASEВерсия.

①,Создайте новый веб-проект SpringBoot, вы можете обратиться кМикросервисы — поиск способов запуска вашего проектаЭта статья.

②,Измените файл pom и добавьтеfastjson, пример следующий:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.62</version>
</dependency>

③,новыйMSTestRedirectControllerфайл, исходный код выглядит следующим образом:

import com.alibaba.fastjson.JSON;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@Controller
@RequestMapping(value = "testredirect")
public class MSTestRedirectController {

    @GetMapping(value = "/access/web")
    public String redirect() {
        return "redirect:/testredirect/index/realweb?parameter=coming";
    }

    @ResponseBody
    @GetMapping(value = "/index/realweb")
    public String real(HttpServletRequest request) {
        return "redirect happened:" + JSON.toJSONString(request.getParameterMap());
    }
}

Несколько замечаний:

  • Поскольку это перенаправление, Контроллер не может быть использован.@RestControllerиспользовать аннотацию@Controllerаннотация;

  • здесь использовано ключевое словоredirectреализовать перенаправление;

④,Запустите проект и перейдите по следующему URL-адресу в браузере.

http://localhost:8080/testredirect/access/web

Вы можете видеть, что браузер перенаправлен, и скриншот выглядит следующим образом:

在这里插入图片描述
В дополнение к описанному выше методу для достижения перенаправления вы также можете использоватьHttpServletResponseизsendRedirectметод, пример выглядит следующим образом:

@GetMapping(value = "/access/web2")
public String redirect2(HttpServletResponse response) {
    try {
        // 方法1:自定义状态码方式
        // String url = "http://localhost:8080/testredirect/index/realweb?parameter=coming";
        //response.setHeader("Location", url);
        //response.sendError(301);
        
        // 方法2:sendRedirect,默认返回的状态码是 302
        response.sendRedirect("/testredirect/index/realweb?parameter=coming");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        return "";
    }
}

процесс запроса короткого адреса

я получаю URLhttp://www.veryitman.com/В качестве примера можно использовать сервис коротких адресов Baidu.

существуетСтраница с коротким адресом Baiduгенерироватьhttp://www.veryitman.com/Соответствующий короткий адрес показан на следующем рисунке:

在这里插入图片描述
получить короткий адресhttps://dwz.cn/hnmau4ZsСкопируйте этот адрес в адресную строку вашего браузера (я использую Chrome) и откройте режим обзора Chrome. Переключитесь на опцию «Сеть» и нажмите Enter, чтобы открыть короткий URL-адрес.
在这里插入图片描述
HTTP отправил запрос GET (красный 1), адрес запросаhttps://dwz.cn/hnmau4Zs, сервер (служба коротких адресов Baidu) возвращается в браузер Chrome302Код состояния, браузер снова будет использовать код перенаправления, когда найдет его.LocationСодержащийся в нем адрес отправляет второй запрос, запрос перенаправления.

Вы также можете использовать службу коротких адресов Weibo. Напомните нам, что код возврата запроса короткого адреса Weibo:301И Байду возвращается302код ответа.302Код состояния разрешает все виды перенаправлений, которые обычно реализуются как перенаправления на GET, но нет гарантии, что POST будет перенаправлен на POST.302Указывает, что ресурсы старого адреса А все еще (все еще доступны), и это перенаправление является лишь временным переходом со старого адреса А на адрес В; и301Код состояния указывает, что целевой ресурс был окончательно перемещен на новый URI, и любые будущие ссылки на этот ресурс должны использовать новый URI.

Принцип короткого адреса

Сначала мне было любопытно, почему я преобразовал длинный адрес A в короткий адрес B, а затем использовал B для доступа к контенту, который все еще является адресом A, как это делает браузер?

Благодаря приведенному выше примеру процесса запроса, я считаю, что каждый должен иметь общее представление о принципе запроса короткого адреса.

В службе коротких адресов Baidu мыhttp://www.veryitman.com/Перевести вhttps://dwz.cn/hnmau4Zs, в настоящее время поддерживается служба коротких адресов Baidu短-长Отношение сопоставления адреса установлено и уникально, когда мы идем в гостиhttps://dwz.cn/hnmau4Zs, по сути, запрос представляет собой службу коротких адресов Baidu, служба будет представлять собой длинный адрес, соответствующий короткому адресу (размещенному в заголовке ответаLocation) обратно в наш браузер с кодом состояния 302, после чего браузер перенаправляется наhttp://www.veryitman.com/Этот URL активен.

Краткое изложение шагов выглядит следующим образом:

Шаг-1, пользователь входит в браузерhttps://dwz.cn/hnmau4ZsПосетите этот URL-адрес;

Шаг 2. Браузер разрешает DNS для получения IP-адреса, соответствующего доменному имени;

Шаг 3. После получения IP браузер отправляет запрос HTTP GET.hnmau4Zsи получитьhttps://dwz.cn/hnmau4Zsсоответствующий длинный адрес;

Шаг 4, HTTP-проход302Код состояния идет на запрос соответствующего длинного адресаhttp://www.veryitman.com/выше.

я кладуhttp://www.veryitman.com/Генерация коротких адресов для Baidu и Weibo:

// 百度短地址
https://dwz.cn/hnmau4Zs
// 微博段地址
http://1t.click/aMtD

Видно, что генерация Baidu сложнее, во-первых, протокол становитсяHTTPS, а во-вторых сгенерированный код 8-битный (hnmau4Zs), а Weibo генерирует 4 цифры (aMtD) код.

Короткий адресный код обычно состоит из 26 прописных букв.A-Z, 26 строчных буквa-zи 10 номеров0-9Всего случайным образом комбинируются 62 символа, поэтому таким образом вы можете сгенерировать короткий адресный код.Мы определяем 62-значное число и преобразуем эти 62 символа в 62-значное число в соответствии с десятичным числом, тогда вы можете получить соответствующий номер каждого символа 62 базового числа. Точно так же при восстановлении короткого адреса достаточно преобразовать шестнадцатеричное в соответствующее десятичное.

Согласно приведенному выше алгоритму видно, что Baidu может поддерживать 62 ^ 8 коротких адресов, а Weibo — 62 ^ 4 коротких адреса.

Что касается алгоритма генерации коротких адресов, вы можете использовать SpringBoot, чтобы создать его самостоятельно, или выйти в Интернет, чтобы найти то, что уже реализовано другими.


Жить - это не сочувствовать слезами, а аплодировать потом~

在这里插入图片描述