предисловие
ping-urlЭто небольшой инструмент, исходный код которого я недавно выложил в открытый доступ, и эта статья также является научно-популярной статьей, посвященной концепции его дизайна.
зачем это делатьping-urlКак насчет инструментов с открытым исходным кодом?
Причина в том, что этот младший брат однажды получил особую просьбу,Используйте интерфейсный метод, чтобы определить, можно ли получить доступ к любому URL-адресу в обычном режиме..
Так что не хватает спроса, за ним обычно яма :)
Во-первых, подумайте об этом.Для достижения этой функции у вас должны быть следующие 2 очка:
- Инициировать запрос URL в обычном режиме
- следить за статусом запроса
Как только у вас появится идея, начинайте закатывать рукава и усердно работать!
Сначала определите, доступен ли URL-адрес
Из-за механизма безопасности браузера -Та же политика происхождениясуществование, достижение任意Это требование действительно немного сложно.
Политика того же источника ограничивает взаимодействие документов или сценариев, загруженных из одного источника, с ресурсами из другого источника. Это важный механизм безопасности для изоляции потенциально вредоносных файлов.
Поэтому, чтобы добиться нормального доступа к любому url, нужно решить первую проблему:перекрестный домен.
1.1 Решение ограничения одного и того же происхождения
Ветераны интерфейс вскоре ассоциируютJSONP. Принцип заключается в том, чтобы использоватьscriptФункции, доступные для всех источников.
Исходя из этого, можно сделать расширение для поиска всех html-тегов, доступных из разных источников:
<script><img><link><video><audio><audio><iframe>
1.2 Как оценить доступность
Из тегов html, к которым можно получить доступ в разных странах, отфильтруйте теги html, которые могут поддерживатьonerrorа такжеonloadТеги событий, вы можете положиться на теги, чтобы хорошо завершить разработку функций.
Здесь объясняется:
-
onerrorРоль событий
Если ресурс, запрошенный тегом перекрестного происхождения, отличается от формата файла, который может быть проанализирован сам по себе, он сообщитerrorмероприятие.
URL-адрес, который необходимо обнаружить, обычноhtml.
такonerrorСобытия можно использовать для прослушивания запросов и получения отзывов.errorвремя потрачено. Таким образом, можно напрямую рассчитать задержку доступа к сети.
Но, к сожалению, точность не 100%.
Потому что есть ситуация: сам url является мертвой ссылкой.
После инициирования http-запроса с мертвой ссылкой вы получитеfailedположение дел. В этой ситуацииonerrorтакже срабатывает. -
зачем нужно
onloadмероприятие?
onloadСобытие запускается, когда ресурс был загружен.
Пока это событие запускается, оно доказывает, что URL-адрес не является мертвой ссылкой.
Это поможетonerrorИсключите непредвиденные ситуации и доведите точность до 100%!
На основании двух указанных выше жестких требований теги фильтруются следующим образом:
<script><img><link>
в<iframe>Недостаток: пока сервер установленX-Frame-OptionsЗаголовок сообщения немедленно отбрасывается. Так тоже исключили.
X-Frame-Options — это HTTP-заголовок (заголовок), используемый для того, чтобы сообщить браузеру, можно ли разместить эту страницу в iFrame.
1.3 Существующие риски безопасности
<script>Хотя это может удовлетворить потребности, существует очень фатальная проблема: существует вероятность атаки XSS.
Если ресурс, соответствующий URL-адресу,самовыполняющаяся функция js, вполне можно использовать для плохих дел.
<img>тег, потому что он может вызвать толькоonerror, так что это тоже исключено.
1.4 Разбор кода
Наконец только<link>Можно использовать этикетки.
Поскольку метод парсинга — CSS, возможность атаки отсутствует.
Вот код реализации:
function getStatus(url: string){
return new Promise((resolve, reject) => {
let link = document.createElement('link');
link.rel="stylesheet";
link.type="text/css"
link.href = url;
link.onload = function(){
resolve(true);
}
link.onerror = function(){
resolve(false);
}
document.body.appendChild(link);
})
}
- путем создания
<link>node и добавьте адрес ресурсаurl - Добавить событие слушателя
onload,onerror - Присоединяйся
body, обратиться с просьбой
Следует отметить, что необходимо объявитьrelа такжеtype, иначе связанное событие не будет запущено.
2. Рассчитайте задержку в сети
Поскольку кросс-доменный CSS требует правильно установленного заголовка Content-Type, вероятность риска все же остается небольшой.
Поэтому, вычисляя задержку сети,ping-urlпо-прежнему использовать самые консервативные<img>.
2.1 Разбор кода
function getLoadTime(url: string){
return new Promise(resolve => {
let img = document.createElement('img');
img.style.display = "none";
img.src=`${url}/?v=${Math.random()}`;
const timeStart = new Date();
img.onerror = function(){
const timeEnd = new Date();
resolve(timeEnd.getTime() - timeStart.getTime());
}
img.onload = function(){
const timeEnd = new Date();
resolve(timeEnd.getTime() - timeStart.getTime());
}
document.body.appendChild(img);
});
}
- генерировать
<img>узел, добавьте URL-адрес запроса ресурса и установите стиль наdisplay:none, чтобы не повлиять на страницу - время начала записи
timeStart - добавить событие слушателя
onerror,onload - Присоединяйся
body, обратиться с просьбой - После запуска события рассчитайте время задержки
Вот небольшая деталь, добавьте случайное число после URLv=***. Это позволяет избежать ситуаций кэширования.
3. Совместное использование открытого исходного кода
Хотя это небольшой проект, он весьма полезен. Поэтому используйте свободное время, чтобы упаковать его в пакет npm и опубликовать наnpmjs.comначальство.
Исходный код также синхронизирован с GitHub, вы можете нажать, чтобы посетитьping-url.
Если это поможет вам, вы можете наградить звездой.
Ссылаться на
[1] Система диагностического анализа Huatuo
[2] Подробно объясните тег script
[3] Перестаньте задавать мне междоменные вопросы
[4] : элемент ссылки на внешний ресурс.
[5] Доступ к сети из разных источников
Друзья, которым нравятся мои статьи, могут подписаться на меня следующими способами:
- "звезда"или"смотреть"мойGitHub blog
- RSS-канал моего личного блога:База мистера Вана