Spring WebSocketJava学习笔记

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错误。

上一篇下一篇

猜你喜欢

热点阅读