Spring WebScoket 消息推送及问题总结

正在做一个文件下载功能,当用户点击生成文件之后,服务器端异步生成文件,生成好之后给浏览器推送一个消息,然后用户再去下载中心下载生成好的文件。

消息推送我用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错误。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,854评论 18 139
  • 使用 HTTP 服务器或客户端功能必须调用require('http')。 Node 里的 HTTP 接口支持协议...
    保川阅读 1,393评论 0 1
  • 圣诞节的时候,巧哥直播了,这次直播给我们提供了很多信息,首先要注意的是两个要开源的事件,一个是腾讯,它将开源它自己...
    一个有个性的女汉子阅读 383评论 0 2
  • 鬼魂的哭泣是死者的悲哀,是世间之苦的证据,可这种哭泣却没有泪水,就好像是隐匿在心底的痛苦,终究是发泄不出来的。 我...
    叶落凡天阅读 705评论 0 0