javascript - AuthorizedHandler 阻止了错误的请求!网址 :/socket. io/

标签 javascript websocket socket.io

我正在使用 mrniko/netty-socketio (Java) 来启动一个 websocket 服务器,如下所示:

config = new Configuration();
config.setHostname("localhost");
config.setPort(8001);
server = new SocketIOServer(config);
server.addListeners(serviceClass);
server.start();

然后我使用(推荐的)socketio/socket.io-client (JavaScript) 尝试像这样连接到 websocket 服务器(全部在同一服务器上):

var socket = io("http://localhost:8001");

连接在服务器上被“阻止”并进行服务器打印:

8239 [nioEventLoopGroup-5-1] WARN com.corundumstudio.socketio.handler.AuthorizeHandler  - Blocked wrong request! url: /socket.io/, ip: /127.0.0.1:48915
28889 [nioEventLoopGroup-5-2] WARN com.corundumstudio.socketio.handler.AuthorizeHandler  - Blocked wrong request! url: /socket.io/, ip: /127.0.0.1:48916

随着客户端不断重试连接,这种情况会不断发生。

我似乎无法让服务器接受连接。我试过:

var socket = io("ws://localhost:8001");

但这给出了相同的结果。我还尝试在这两种情况下在 URL 后添加尾部斜杠 - 没有区别。我还尝试了在服务器和客户端上使用“localhost”或“127.0.0.1”的所有组合,等等。

JavaScript 页面本身由 localhost:8000 上的 http 服务器提供。这似乎不是跨站点问题,因为这会在浏览器中产生完全不同的错误。

有人知道出了什么问题以及如何解决吗?

最佳答案

在我的例子中,网络监控每 10 秒访问该端口一次。我已暂时将 log4j.properties 更改为错误级别日志记录,但希望为网络提供一条不会导致过多警告日志记录的使用路径。不确定这是否是最好的方法,但这就是我最终所做的。

config.setAllowCustomRequests(true); 通过允许自定义请求,Authorizehandler 中显示警告的代码段被绕过。

我创建了一个自定义管道,它允许我用自定义管道切换出错误的UrlHandler,以允许使用安全路径进行监控。

public class CustomSocketIOChannelInitializer extends SocketIOChannelInitializer {

   CustomWrongUrlHandler customWrongUrlHandler = null;

   public CustomSocketIOChannelInitializer(Configuration configuration) {
      customWrongUrlHandler = new CustomWrongUrlHandler(configuration);
   }

   protected void initChannel(Channel ch) throws Exception {
       ChannelPipeline pipeline = ch.pipeline();
       addSslHandler(pipeline);
       addSocketioHandlers(pipeline);
       // Replace wrong url handler with our custom one to allow network monitoring without logging warnings.
       pipeline.replace(SocketIOChannelInitializer.WRONG_URL_HANDLER, "CUSTOM_WRONG_URL_HANDLER", customWrongUrlHandler);
   }

这是我的自定义处理程序:

@Sharable
public class CustomWrongUrlHandler extends ChannelInboundHandlerAdapter {

    private final Logger log = LoggerFactory.getLogger(getClass());

    Configuration configuration = null;

    /**
    * @param configuration
    */
   public CustomWrongUrlHandler(Configuration configuration) {
       this.configuration = configuration;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

       if (msg instanceof FullHttpRequest) {
          FullHttpRequest req = (FullHttpRequest) msg;
          Channel channel = ctx.channel();
          QueryStringDecoder queryDecoder = new QueryStringDecoder(req.getUri());

          // Don't log when port is pinged for monitoring. Must use context that starts with /ping.
          if (configuration.isAllowCustomRequests() && queryDecoder.path().startsWith("/ping")) {
              HttpResponse res = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.BAD_REQUEST);
              channel.writeAndFlush(res).addListener(ChannelFutureListener.CLOSE);
              req.release();
              //log.info("Blocked wrong request! url: {}, ip: {}", queryDecoder.path(), channel.remoteAddress());
              return;
          } 

          // This is the last channel handler in the pipe so if it is not ping then log warning.
          HttpResponse res = new DefaultHttpResponse(HTTP_1_1, HttpResponseStatus.BAD_REQUEST);
          ChannelFuture f = channel.writeAndFlush(res);
          f.addListener(ChannelFutureListener.CLOSE);
          req.release();
          log.warn("Blocked wrong socket.io-context request! url: {}, params: {}, ip: {}", channel.remoteAddress() + " " + queryDecoder.path(), queryDecoder.parameters());
      }
    }
}


 CustomSocketIOChannelInitializer customSocketIOChannelInitializer = new CustomSocketIOChannelInitializer(config);
  server.setPipelineFactory(customSocketIOChannelInitializer);

关于javascript - AuthorizedHandler 阻止了错误的请求!网址 :/socket. io/,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33315676/

相关文章:

javascript - jQuery - 淡入按类选择的对象

javascript - 如何在可用时使 Angular.js 应用离线并与服务器同步

javascript - 解决node js循环依赖

html - 我的 HTML 页面如何在客户端访问 socket.io?

javascript - Socket.io 没有从每个 react 组件中删除监听器

javascript - 无论我做什么,Socket.io 重新连接都会触发

javascript - 无法使用ajax在php函数中传递值

javascript - 如何在 brython 中创建 websocket JSObject?

javascript - 修改现有的双工 WCF 服务以与 JavaScript 一起使用

javascript - 当选择更改值时如何替换脚本标记的源