正在做一個文件下載功能,當用戶點擊生成文件之后厅须,服務(wù)器端異步生成文件仿畸,生成好之后給瀏覽器推送一個消息,然后用戶再去下載中心下載生成好的文件朗和。
消息推送我用websocket解決错沽,以下是使用方式及我遇到的問題。
客戶端代碼
如下:
var url='ws://localhost:8889/collection-web/socket';
var ws=new WebSocket(url);
ws.onopen=function(){
}
ws.onmessage=function(event){
showAlert(event.data);
}
服務(wù)器端配置
<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价匠,但是一直被服務(wù)器拒絕残炮,403錯誤挖胃,因為我的客戶端請求為跨域請求,sockjs默認發(fā)送為'XMLHttpRequest'坞古,所以不能使用sockjs.
還有备韧,如果沒有加上setAllowedOrigins,也為403錯誤痪枫。