在相同的上下文中,这是Server Websocket处理程序和普通servlet的可能性



这可以在相同的上下文中服务WebSocket处理程序和普通servlet?

示例

http://localhost/appcontext/endpoint  --> serving by normal servlet
ws://localhost/appcontext/endpoint --> serving by websocket handler

我尝试了多种方法,但无法做到。似乎URL映射是由上下文路径过滤的,而不是由" HTTP"或" WS"之类的协议过滤。可能是我发现错的。我试图使用Spring和Java看到这一点。

简短答案:

nope,您无法使用Servlet或Websocket提供的相同路径。每个http请求http://localhost/appcontext/endpoint都有特定的行为

长答案:

此答案超出了Java范围,因为它主要依赖于RFC 6455,也就是Websocket圣经。原因是握手过程。

WebSocket URIS

在RFC 6455的第3节中,Websocket URI定义为:

ws-uri =" ws:"&quot//&quot主持人[:" quot;端口]路径[&quot?"查询]

wss-uri =" wss:"&quot//&quot主持人[:" quot;端口]路径[&quot?"查询]

将URI详细信息抛在一边,实际上可能认为只能仅使用HTTP协议访问HTTP对应物。

握手:客户端

提醒:Websocket是双向协议。因此,客户端是初始连接的实体。但是,一旦建立了连接,客户端和服务器都可以发送消息或关闭通信。但是,服务器和客户端概念不断知道谁是谁

客户端启动握手:"嘿服务器!我想建立一个webosocket通信&quot。但是,握手从HTTP开始。在RFC 6455的第17页(第4.1节):

  1. 握手必须是[RFC2616]指定的有效HTTP请求。

  2. 必须获取请求的方法,并且HTTP版本必须至少为1.1。

    例如,如果Websocket URI是" ws://example.com/chat",则发送的第一行应为" get/cath http/1.1"。

  3. " request-uri"请求的一部分必须匹配第3节(相对URI)中定义的/资源名称/定义,或者是绝对的HTTP/HTTPS URI,当解析时,它具有a/resource name/,/host/和/port/at匹配/port/相应的WS/WSS URI。

每个WebSocket通信初始化都隐藏了同一路径的HTTP请求。回到您的示例:

  1. 客户询问ws://localhost/appcontext/endpoint
  2. 它实际上要求使用升级请求和RFC 6455定义的适当标头
  3. 要求http://localhost/appcontext/endpoint
  4. 服务器答案,仅在握手之后,通信从http(s)转到ws(s)

握手:服务器端

但是,如果您想作弊并说" 我假装我不知道这是一个Websocket Uri,我想访问此URL &quot的HTTP资源。在服务器端,您的应用程序已注册了一个路径http://localhost/appcontext/endpoint,以匹配URI的"我正在等待WebSocket在此处等待Websocket"连接"与Web服务路径匹配过程相似。在RFC 6455的第4.2.1节中:

客户的开头握手包括以下部分。如果服务器在阅读握手时发现客户端没有发送与下面描述相匹配的握手(请注意,根据[RFC2616],标头字段的顺序并不重要),包括但不限于任何违规行为在为握手组件指定的ABNF语法中,服务器必须停止处理客户端的握手,并使用适当的错误代码返回HTTP响应(例如400个不良请求)。

  1. http/1.1或更高的获取请求,包括"请求 - uri"[RFC2616]应解释为第3节中定义的A/资源名称/定义(或包含/资源名称的绝对HTTP/HTTPS URI/).

  2. a |主机|包含服务器授权的标题字段。

  3. a |升级|包含" websocket"的标题字段"被视为ASCII案例不敏感的值。

由于http://localhost/appcontext/endpoint已注册了WebSocket握手,因此基本的HTTP请求不包括Upgrade标头,然后由服务器拒绝。

编辑

写这个答案时,我尝试了以下方式:

  1. 端点:appcontext/endpoint
  2. 页面:appcontext/endpoint/index.xhtml
  3. 欢迎文件:index.xhtml:因此appcontext/endpoint重定向到index.xhtml

正如预期的那样,我的Websocket连接失败。如果我将页面路径从endpoint/index.xhtml更改为endpoint2/index.xhtml,则Websocket可以返回。

但是,我刚刚发现http://demos.kaazing.com/echo/使用相同的URL进行其websocket连接,我找不到为什么为什么

相关内容

最新更新