【问题标题】:'Access-Control-Allow-Origin' with Socket.IO on Java ServerJava 服务器上带有 Socket.IO 的“Access-Control-Allow-Origin”
【发布时间】:2014-05-18 20:46:42
【问题描述】:

我遇到了以下问题:我正在使用 socket.io (netty socket.io - https://github.com/mrniko/netty-socketio) 运行 JAVA 服务器 - 我正在尝试通过 javascript 从不同的 Web 服务器访问该服务器。

为了测试,我正在尝试运行演示聊天 (https://github.com/mrniko/netty-socketio-demo)。

现在的问题是我不断收到以下信息

XMLHttpRequest cannot load http://myserver/socket.io/1/?t=1400445162388. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'myclient.com' is therefore not allowed access. 

所以最大的问题是:我如何允许访问我的 java 服务器?我找到了一些解决方案,说要在其中添加“标题”,但我不知道该放在哪里。这会进入 socket.io 服务器代码吗?

我想我需要这样的东西,放在 JAVA 服务器上的某个地方:

response.setHeader("Access-Control-Allow-Origin", "*");

这是启动服务器的代码:

Configuration config = new Configuration();
    config.setHostname("localhost");
    config.setPort(80);
    final SocketIOServer server = new SocketIOServer(config);
    //ChatObject wurde extra implementiert, ggf. loeschen
    server.addJsonObjectListener(ChatObject.class, new DataListener<ChatObject>() {
        @Override
        public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) throws Exception {
            // broadcast messages to all clients
            server.getBroadcastOperations().sendJsonObject(data);
        }
    });
    server.start();

这是我从服务器得到的输出:

error: The specified resource was not found: /static/flashsocket/WebSocketMain.swf
error: The specified resource was not found: /static/flashsocket/WebSocketMainInsecure.swf
info: Session store / pubsub factory used: {}MemoryStoreFactory (local session store only)
info: SocketIO server started at port: {}80

非常感谢任何帮助!谢谢

【问题讨论】:

  • 否;您需要配置 Socket.io 以允许您的来源。
  • 谢谢@SLaks 你能给我一个关于如何以及在哪里做的方向吗?
  • 谢谢,我已经找到那个页面了。如果我做对了,它说默认情况下设置了“*”,允许从任何地方访问,对吗?另外,这是一个 java 服务器,所以我不能使用 java 脚本代码,对吧?还是我必须在我的客户端 java 上添加它?
  • 我的意思是客户端java脚本

标签: java javascript sockets socket.io


【解决方案1】:

我昨天遇到了类似的问题,并且大部分都解决了。我想在这里分享我的解决方案。
首先,我们都知道所谓的CORS标准(跨域资源共享),即我们从A网站打开的一个资源向B网站(reference)请求另一个资源。因此,在您的情况下,假设原始 Web 服务器(域为 AAA.com)和您的 netty 服务器(域 BBB.com),然后将此行附加到您的 netty 服务器以获得许可:

config.setOrigin("http://AAA.com");

请注意,您不能在 netty-socketio 中为 Access-Control-Allow-Origin 使用通配符 (*),因为它设置了凭据(即,Access-Control-Allow-Credentials em>) 默认为 TRUE (see here)。请记住,浏览器还将拒绝任何没有 Access-Control-Allow-Credentials: true 标头的响应,并且不会使响应可用于调用 Web 内容强>。希望这些帮助。

以下是我的库版本:
netty-socketio 版本

<dependency>
    <groupId>com.corundumstudio.socketio</groupId>
    <artifactId>netty-socketio</artifactId>
    <version>1.7.6</version>
</dependency>

socket.io.javascript

script(type="text/javascript", src="https://cdn.socket.io/socket.io-1.3.5.js")    

【讨论】:

    【解决方案2】:

    使用netty-socketio 1.7.1 或 1.6.6 版本。此版本中添加了通过 Configuration.origin 参数设置自定义 Access-Control-Allow-Origin 的功能。

    【讨论】:

      猜你喜欢
      • 2014-06-07
      • 2021-03-07
      • 2021-10-11
      • 1970-01-01
      • 2012-07-27
      • 2019-02-13
      • 2020-01-05
      • 2017-06-15
      • 1970-01-01
      相关资源
      最近更新 更多