Отправка запросов GET на IP-камеру Panasonic для управления движением PTZ — блокируется CORS

Пожалуйста, простите мое невежество, я новичок в Java, HTML и веб-разработке.

Я пытаюсь создать веб-приложение для управления элементами управления PTZ IP-камеры (Panasonic AW-HE50). Я могу отправлять ему основные команды через браузер в соответствии со спецификацией: https://eww.pass.panasonic.co.jp/pro-av/support/content/guide/DEF/HE50_120_IP/HDIntegratedCamera_InterfaceSpecifications-V1.05E.pdf

Например, я могу запустить его, введя http://172.16.14.90/cgi-bin/aw_ptz?cmd=%23P99&res=1 в браузере.

Теперь я просто пытаюсь перевести это на Java, чтобы при нажатии кнопки на веб-странице выполнялся запрос «GET» для перемещения камеры в определенном направлении.

Мой рассматриваемый код на данный момент выглядит так:

$(document).ready(function(){
  $("button").click(function(){
    $.get(camURL + "T99&res=1", function(data, status){
      alert("Data: " + data + "\nStatus: " + status);
    });
  });
});

Однако сообщение не достигает камеры, и консоль Chrome читает:

«Доступ к XMLHttpRequest по адресу 'http://172.16.14.90/cgi-bin/aw_ptz?cmd=%23T99&res=1' из источника 'http://172.16.14.12' имеет был заблокирован политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

Я провел некоторое исследование по этому поводу, но решения, похоже, больше подходят для серверов. Насколько я знаю, я не могу разрешить доступ к домену, так как это IP-камера, а не сервер. Кроме того, я разместил свою HTML-страницу в той же локальной сети, чтобы обойти это, но это не сработало. Я удивлен, что он не распознается как тот же домен. Я также не уверен, почему браузер может сделать этот запрос на получение, а сценарий Java - нет.

Заранее спасибо за помощь, и еще раз извините за мою неосведомленность.

Энди


person Andy Denyer    schedule 13.02.2019    source источник


Ответы (1)


Это типичная проблема политики одного и того же происхождения, и есть 2 способа ее решения:

  • Взломайте IP-камеру и разместите там HTML-страницы.
  • Переместите код HTTP-запроса к IP-камере с веб-страницы на сервер Java и, таким образом, избегайте ограничения политики того же источника.

Обычно 2-й способ лучше, особенно когда вы можете разместить Java-сервер в одной локальной сети с IP-камерой. Вот некоторые подробные описания:

  1. Разместите HTML-страницу и код JavaScript на сервере Java (думаю, вы уже это сделали).
  2. Когда пользователь нажимает кнопку на веб-странице, отправляет запрос Ajax на сервер Java, а не на IP-камеру. Таким образом, избежать проблемы того же происхождения.
  3. Когда Java-сервер получает вышеупомянутый HTTP-запрос, интерпретируйте действия пользователя и отправьте соответствующий HTTP-запрос на IP-камеру. Поскольку это чисто HTTP-запрос на стороне сервера, он не соответствует политике одного и того же источника.
  4. После того, как сервер Java получит ответ от IP-камеры, верните этот ответ в браузер.

Кстати, в приведенном выше сценарии сервер Java берет на себя роль прокси.

По некоторым вашим вопросам:

"Я изучил этот вопрос, но решения, похоже, больше подходят для серверов."

-- Да, политика CORS — это функция браузера для обеспечения безопасности. Чтобы решить проблему, вам нужно что-то сделать на сервере.

"Я разместил свою HTML-страницу в той же локальной сети, чтобы обойти эту проблему, но это не сработало. Я удивлен, что она не распознается как тот же домен."

-- Чтобы сделать 2 URL-адреса одним доменом (с точки зрения CORS), следующая часть URL-адреса должна быть идентичной: протокол, имя хоста и порт. Перемещение двух компьютеров в одну и ту же локальную сеть не соответствует политике одинакового происхождения для браузера.

"Я также не понимаю, почему браузер может сделать этот запрос на получение, а сценарий Java - нет."

-- Когда вы вводите URL-адрес IP-камеры в адресной строке браузера и нажимаете клавишу возврата, на камеру отправляется простой обычный HTTP-запрос GET, политика одного и того же источника не применяется. Однако, когда вы отправляете HTTP-запрос из кода JavaScript, браузер проверит настройки CORS из соображений безопасности.

person shaochuancs    schedule 19.02.2019
comment
Спасибо за ваш подробный ответ! Теперь это имеет смысл, я рвал на себе волосы, пытаясь найти эти ответы. Я попробую и дам вам знать. - person Andy Denyer; 18.03.2019