Spring WebScoket 消息推送及问题总结
2016-12-01 本文已影响1539人
cat昵称居然被占用了
正在做一个文件下载功能,当用户点击生成文件之后,服务器端异步生成文件,生成好之后给浏览器推送一个消息,然后用户再去下载中心下载生成好的文件。
消息推送我用websocket解决,以下是使用方式及我遇到的问题。
客户端代码
如下:
var url='ws://localhost:8889/collection-web/socket';
var ws=new WebSocket(url);
ws.onopen=function(){
}
ws.onmessage=function(event){
showAlert(event.data);
}
服务器端配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
WebConfig
@Configuration
@EnableWebSocketpublic
class WebSocketConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry){
registry.addHandler(getdownloadFileMessageWebSocketHandler(),"/socket").setAllowedOrigins("http://127.0.0.1:1337");
registry.addHandler(getdownloadFileMessageWebSocketHandler(), "/socket/webSocketServer").withSockJS();
}
@Bean
public DownloadFileMessageWebSocketHandler getdownloadFileMessageWebSocketHandler(){
return new DownloadFileMessageWebSocketHandler();
}}
registry.addHandler(getdownloadFileMessageWebSocketHandler(),"/socket").setAllowedOrigins("http://127.0.0.1:1337");
这行代码用于注册handler类,客户端链接地址为'/socket',允许的客户端链接为"http://127.0.0.1:1337".
第二行同理,但是第二行用于开启,sockjs支持。
WebsocketHandler类:
public class DownloadFileMessageWebSocketHandler implements WebSocketHandler {
private static final List<WebSocketSession> users = Collections.synchronizedList(new ArrayList<WebSocketSession>());
@Override
public void afterConnectionEstablished(WebSocketSession session)
throws Exception {
System.out.println("链接成功");
users.add(session);
}
@Override
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { //TODO }
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
if(session.isOpen()){
session.close();
}
users.remove(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
System.out.println("ConnectionClosed");
users.remove(session); }
@Override
public boolean supportsPartialMessages() {
return false;
}
public void sendMessage(String value){
TextMessage message=new TextMessage(value);
for (WebSocketSession user : users) {
try {
if (user.isOpen()) {
user.sendMessage(message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
sendMessage用于向浏览器推送消息。
问题:websocket跨域,403错误
我之前客户端使用的sockjs,但是一直被服务器拒绝,403错误,因为我的客户端请求为跨域请求,sockjs默认发送为'XMLHttpRequest',所以不能使用sockjs.
还有,如果没有加上setAllowedOrigins,也为403错误。