【问题标题】:jetty websockets only server - no http server - remove the 404 errorjetty websockets only server - no http server - 删除 404 错误
【发布时间】:2011-10-24 16:47:11
【问题描述】:

我使用 jetty 实现了一个小型 web-sockets 服务器,嵌入在一个更大的 java 应用程序中。服务器在 8081 端口上运行,一切正常(在谷歌浏览器中使用小客户端测试)。但是,如果我尝试访问 http://localhost:8081(使用 http 是),我会收到 404 错误,由码头提供支持。

jetty 中是否有办法检测接收到的格式是否基于 websockets 格式,如果不是(在我们的例子中为 http)则只关闭套接字连接并且永远不会返回 404 错误?

谢谢

【问题讨论】:

    标签: java jetty http-status-code-404 websocket embedded-jetty


    【解决方案1】:

    您可以自己执行此操作,但我认为 Jetty 没有打包任何东西可以执行此操作。

    如果你使用WebSocketServlet,那么你应该重写service方法,就像

    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
      if(!"WebSocket".equals(request.getHeader("Upgrade")))
      {
         org.eclipse.jetty.server.Request jettyRequest =  org.eclipse.jetty.server.Request.getRequest(request);
         jettyRequest.getEndPoint().close();
         jettyRequest.setHandled(true);
      }
      else
      {
         super.service(request, response);
      }
    }
    

    如果您已经推出了自己的处理程序,那么您应该能够弄清楚如何使该代码适应您的需求。

    【讨论】:

    • 很抱歉 websockets 在请求中总是会有 Upgrade 标头?
    • 是的,这就是 Websockets 的工作方式。它们以带有特殊标头的普通 HTTP 请求开始,这会导致服务器将其“升级”到 websocket
    【解决方案2】:

    Tim 建议的是 WebSocketServlet 已经在做的事情。 https://github.com/eclipse/jetty.project/blob/master/jetty-websocket/src/main/java/org/eclipse/jetty/websocket/WebSocketServlet.java

    只需扩展 WebSocketServlet,然后使用各种 doGet、doPost、doPut 方法来处理 HTTP 请求。让 service() 方法独自完成它需要做的事情。

    【讨论】:

    • WebSocketServlet 没有做任何事情。 Duoa 希望在不提供 HTTP 响应的情况下关闭非 websocket 请求。 WebSocketServlet 也处理普通的 HTTP 请求... ...普通的 HTTP 请求,如果没有其他东西处理它们,则提供 404 响应。完全有可能覆盖 doGet、doPost 等并在它们中调用 EndPoint.close(),但这只是我建议的替代(更糟糕的是 IMO)实现。
    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 2011-12-14
    • 2019-04-05
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多