sockjs 跨域_Spring 5.2.2 WebSockets之SockJS回退

SockJS回退

     在公共Internet上,超出控制范围的限制性代理可能会阻止WebSocket交互,这可能是因为它们未配置为传递Upgrade header,或者是因为它们关闭了看起来空闲的长期连接。

    解决这个问题的方法是WebSocket仿真,即先尝试使用WebSocket,然后再使用基于HTTP的技术来模拟WebSocket交互并公开相同的应用程序级API。

    在Servlet堆栈上,Spring框架为SockJS协议提供了服务器(以及客户端)支持。

SockJS简介

        SockJS的目标是让应用程序使用WebSocket API,但在运行时需要时,可以返回到非WebSocket的替代方案,而无需更改应用程序代码。

SockJS包括:

  • 以可执行narrated tests的形式定义的SockJS协议。

  • SockJS JavaScript客户端——浏览器中使用的客户端库。

  • SockJS服务器实现,包括Spring框架spring-websocket模块。

  • spring-websocket模块中的SockJS  Java客户端(从4.1版开始)。

narrated tests的形式(python实现):

import osimport timeimport jsonimport reimport unittest2 as unittestfrom utils_03 import GET, GET_async, POST, POST_async, OPTIONS, old_POST_asyncfrom utils_03 import WebSocket8Clientfrom utils_03 import RawHttpConnectionimport uuidtest_top_url = os.environ.get('SOCKJS_URL', 'http://localhost:8081')base_url = test_top_url + '/echo'close_base_url = test_top_url + '/close'wsoff_base_url = test_top_url + '/disabled_websocket_echo'cookie_base_url = test_top_url + '/cookie_needed_echo'

    SockJS是为浏览器设计的。它使用多种技术来支持多种浏览器版本。传输分为三类:WebSocket、HTTP流和HTTP长轮询。

     SockJS客户端首先发送GET /info从服务器获取基本信息。之后,它必须决定使用什么传输工具。如果可能,使用WebSocket。如果不是,在大多数浏览器中,至少有一个HTTP流选项。如果不是,则使用HTTP(长)轮询。

所有传输请求都具有以下URL结构:

https://host:port/myApp/myEndpoint/{server-id}/{session-id}/{transport}
  • {server-id}对于在集群中路由请求很有用,但不能在其他情况下使用。

  • {session-id}关联属于SockJS会话的HTTP请求。

  • {transport}表示传输类型(例如,websocket、xhr-streaming和其他类型)。

       WebSocket传输只需要一个HTTP请求就可以完成WebSocket握手。此后的所有消息都在该socket上交换。

      HTTP传输需要更多请求。例如,Ajax/XHR流依赖于服务器到客户端消息的一个长时间运行的请求,以及客户端到服务器消息的其他HTTP POST请求。长轮询与此类似,只是它

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值