【问题标题】:How can I enable Cross-Domain-Origin using Undertow如何使用 Undertow 启用跨域源
【发布时间】:2019-03-20 22:40:10
【问题描述】:

我创建了一个网络服务器,允许我的网站通过 API 访问我的游戏数据。我的网络服务器看起来像这样(我正在使用me.apachenick 框架)

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));
    }
}

当我现在运行 Web 服务器 (WebServer.initialize()) 并从我的浏览器转到 XX.X.XX.XX:8080/online/players 时 - 这工作正常!我可以看到世界上所有的玩家。

但是,当我像这样从 PHP 发送 cURL 请求时

$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);

我收到此错误:

布尔(假)
阵列
7
无法连接到 XX.X.XX.XXX 端口 8088:连接被拒绝

这告诉我在请求的资源上未启用跨域。如何在我的 Java Web 服务器上启用跨域?

【问题讨论】:

    标签: java php linux debian cross-domain


    【解决方案1】:

    我认为这不是 CORS 问题,而是您的 curl 配置。您正在尝试通过 8088 端口连接,但服务在 8080 上,请更改为(或从配置中删除,您已经在 CURLOPT_URL 参数中拥有它):

    curl_setopt($ch, CURLOPT_PORT, 8080);
    

    【讨论】:

    • 我以前试过这个,抱歉我没有提到它!它给了我同样的错误,连接被拒绝
    【解决方案2】:

    根据 Undertow,要启用 CORS,您必须下载 CORS 过滤器库。

    由于这只是对我的网络服务器工作方式的限制,我改变了角度并简单地做到了,因此服务器请求网络服务器,而不是反过来。

    是的,这是一个很长的路要走,但这是最简单的方法。

    如果有人知道如何在我的情况下使用 Undertow 启用 CORS,我将更改接受的答案。

    再次感谢

    【讨论】:

    猜你喜欢
    • 2016-04-24
    • 2012-09-09
    • 2016-05-31
    • 2017-03-31
    • 2020-06-30
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多