Таким образом, XMLHttpRequest не должен работать для загрузки локальных файлов для веб-сайтов. Было бы безумным риском для безопасности, если бы человек действительно мог получить доступ к файловой системе пользователя через JavaScript.
Но по какой-то причине, когда я использую XMLHttpRequest для загрузки локального текстового файла в расширении Chrome, он работает. Почему, когда я использую XMLHttpRequest для расширения chrome в фоновом скрипте, он загружает файл? Это недостаток безопасности или это намеренно? И разве это не создает угрозы безопасности, подобные тому, что запрос загружает локальные файлы на веб-странице?
Позвольте мне попытаться объяснить это как можно лучше:
У меня есть текстовый файл с именем abc.txt
, и я хочу открыть его и прочитать содержимое файла через JavaScript, поэтому я решил использовать XMLHttpRequest.
<!DOCTYPE html>
<html>
<body>
<script>
</script>
<script>
let txt = '';
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
if (xmlhttp.status == 200 && xmlhttp.readyState == 4){
txt = xmlhttp.responseText;
console.log(txt)
}
};
xmlhttp.open("GET", "abc.txt", true);
xmlhttp.send();
</script>
</body>
</html>
Я получаю обычную ошибку, test.html:17 Failed to load file:///C:/Users/none/of/your/business/abc.txt: Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.
Однако, когда я делаю расширение Chrome, я могу загрузить локальный файл через скрипт background.js.
файл manifest.js:
{
"name": "Question",
"version": "1.0",
"manifest_version": 2,
"background": {
"persistent": true,
"scripts":["background.js"]
}
}
background.js file:
chrome.runtime.onInstalled.addListener(function() {
let txt = '';
let xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
if (xmlhttp.status == 200 && xmlhttp.readyState == 4){
txt = xmlhttp.responseText;
console.log(txt)
}
};
xmlhttp.open("GET", "abc.txt", true);
xmlhttp.send();
});
доказательство того, что текстовый файл загружен:
Если перефразировать мой вопрос, почему XMLHttpRequests по-разному воспринимает сценарий расширения chrome background.js? Разве это не создает проблемы, подобные тем, что возникают при запросе XMLHttpRequts на веб-странице?
ПРИМЕЧАНИЕ. XMLHttpRequest, кажется, работает только в файле background.js, в ту минуту, когда я связываю файл с HTML-документом, он перестает работать, и я получаю обычное сообщение об ошибке. Поэтому я не могу запустить его для всплывающего HTML-файла.