我创建了一个网络服务器,以允许我的网站通过API访问我的游戏数据。我的Web服务器看起来像这样(我正在使用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);
我收到此错误:
bool(false)
阵列
7
无法连接到XX.X.XX.XXX端口8088:连接被拒绝
这告诉我在请求的资源上未启用跨域。如何在Java Web服务器上启用跨域?
答案 0 :(得分:0)
我认为这不是CORS问题,而是您的curl配置。您正在尝试通过8088端口进行连接,但服务在8080上,请更改为(或从配置中删除,您已经在CURLOPT_URL参数中拥有它):
curl_setopt($ch, CURLOPT_PORT, 8080);
答案 1 :(得分:0)
根据Undertow,要启用CORS,您必须下载CORS过滤器库。
由于这仅仅是对我的Web服务器工作方式的限制,因此我更改了角度并简化了操作,因此服务器请求Web服务器,而不是相反。
是的,这是很长的路要走,但这是最简单的方法。
如果在我的情况下任何人都知道如何启用Undertow的CORS,我将更改已接受的答案。
再次感谢