Как включить Cross-Domain-Origin с помощью Undertow - PullRequest
0 голосов
/ 17 марта 2019

Я создал веб-сервер, который позволяет моему веб-сайту получать доступ к моим игровым данным через API. Мой веб-сервер выглядит так (я использую me.apachenick framework)

public class WebServer {
    public static void initialize() {
        ServerController server = new ServerController("192.168.0.21", 8080, 8443);
        server.register(new APIVirtualHost());
        server.inititialize();
    }
}

Мой APIVirtualHost выглядит так

public class APIVirtualHost extends AbstractVirtualHost {
    public static final String HOST_NAME = "XX.X.XX.XXX";

    public APIVirtualHost() {
        super(HOST_NAME);
        setDirectoryListingEnabled(false);
    }
}

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

@RouteManifest(template="/online/players", method="GET")
public class APIHighscoresRoute extends RouteHttpHandler<JadePreprocessor> {
    @Override
    public void handleRequest(HttpServerExchange exchange) throws Exception {
        Gson builder = new GsonBuilder().setPrettyPrinting().create();
        JsonArray arr = new JsonArray();
        World.getPlayers().forEach(o -> {
            JsonObject obj = new JsonObject();
            obj.addProperty("username", o.getUsername());
            arr.add(obj);
        });
        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/html");
        exchange.getResponseSender().send(builder.toJson(arr));
    }
}

Когда я сейчас запускаю веб-сервер (WebServer.initialize()) и перехожу на XX.X.XX.XX:8080/online/players из моего браузера - это работает отлично! Я могу видеть всех игроков в мире.

Однако, когда я отправляю запрос cURL из PHP, вот так

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://XX.X.XX.XXX:8080/online/players');
curl_setopt($ch, CURLOPT_PORT, 8088);
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$response = curl_exec($ch);
var_dump($response);
echo curl_getinfo($ch) . '<br/>';
echo curl_errno($ch) . '<br/>';
echo curl_error($ch) . '<br/>';
curl_close($ch);

Я получаю эту ошибку:

bool (false)
Массив
7
Не удалось подключиться к порту 8088 XX.X.XX.XXX: соединение отклонено

Что говорит мне, что Cross-Origin не включен на запрошенном ресурсе. Как я могу включить перекрестное происхождение на моем веб-сервере Java?

Ответы [ 2 ]

0 голосов
/ 20 марта 2019

Согласно Undertow, чтобы включить CORS, вы должны загрузить библиотеку фильтров CORS.

Поскольку это было просто ограничение работы моего веб-сервера, я изменил угол обзора и просто сделал так, чтобы сервер запрашивалвеб-сервер, а не наоборот.

Да, это долгий путь, но это был самый простой способ.

Если кто-нибудь знает, как включить CORS с Undertow в моемОбстоятельства, я буду изменять принятый ответ.

Еще раз спасибо

0 голосов
/ 17 марта 2019

Я думаю, что это не проблема CORS, а ваша конфигурация curl. Вы пытаетесь подключиться через порт 8088, но служба работает на 8080, измените на (или удалите из конфигурации, у вас это уже есть в параметре CURLOPT_URL):

curl_setopt($ch, CURLOPT_PORT, 8080);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...