Spring Framework 提供了一个 WebSocket API,您可以使用它来编写处理 WebSocket 消息的 client-和 server-side applications。
WebSocket API
1. WebSocketHandler
创建 WebSocket 服务器就像实现WebSocketHandler一样简单,或者更有可能扩展TextWebSocketHandler或BinaryWebSocketHandler。
1 | public class MyHandler implements WebSocketHandler { |
使用xml或者Java配置方式配置Bean。
2.WebSocket 握手
自定义初始 HTTP WebSocket 握手请求的最简单方法是通过HandshakeInterceptor,它在握手之前“之前”和“之后”暴露方法。您可以使用此类拦截器来阻止握手或使WebSocketSession可以使用任何属性。以下 example 使用 built-in 拦截器将 HTTP session 属性传递给 WebSocket session:
1 | /** |
3. 部署
web.xml
1 |
|
4. 服务器 Configuration
每个底层 WebSocket 引擎都会公开控制运行时特征的 configuration properties,例如消息缓冲区大小,idle 超时等等。
对于 Tomcat,WildFly 和 GlassFish,您可以将ServletServerContainerFactoryBean添加到 WebSocket Java 配置中
1 |
|
5.跨域问题
从 Spring Framework 4.1.5 开始,WebSocket 和 SockJS 的默认行为是仅接受 same-origin 请求。也可以允许所有或指定的起源列表。
三种情况:
- 仅允许 same-origin 个请求(默认):在此模式下,启用 SockJS 时,Iframe HTTP 响应头X-Frame-Options设置为SAMEORIGIN,并且禁用 JSONP 传输,因为它不允许检查请求的来源。因此,启用此模式时不支持 IE6 和 IE7。
- 允许指定的原始列表:每个允许的原点必须以http://或https://开头。在此模式下,启用 SockJS 时,将禁用 IFrame 传输。因此,启用此模式时,不支持 IE6 到 IE9。
- 允许所有来源:要启用此模式,您应提供*作为允许的原始值。在此模式下,所有传输都可用。
配置 WebSocket 和 SockJS 允许的源:
1 |
|
SockJS
有一些浏览器中缺少对WebSocket的支持,而SockJS是一个浏览器的JavaScript库,它提供了一个类似于网络的对象,SockJS提供了一个连贯的,跨浏览器的JavaScriptAPI,它在浏览器和Web服务器之间创建了一个低延迟、全双工、跨域通信通道。SockJS的一大好处在于提供了浏览器兼容性。即优先使用原生WebSocket,如果浏览器不支持WebSocket,会自动降为轮询的方式。
启用 SockJS
1 |
|