предисловие
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-канал моего личного блога:База мистера Вана