angular - 不兼容的 SockJS!主站使用: "1.1.4", iframe : "1.0.0". 怎么处理?

标签 angular spring-boot iframe websocket

我在使用 SpringBoot 和 Angular2 时遇到了 WebSocket 问题:

不兼容的 SockJS!主站点使用:“1.1.4”,iframe:“1.0.0”。

截图:consoleOutput

我认为该错误(不兼容 SockJS!主站点使用:“1.1.4”,iframe:“1.0.0”。)会产生握手响应的下一个问题。

Spring Boot :

网络套接字配置

package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/socket").setAllowedOrigins("*").withSockJS();
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/chat");
        registry.setApplicationDestinationPrefixes("/app");
    }
}

Controller
package com.example.demo;


import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class WebSocketController {

    @MessageMapping("/send/message") 
    @SendTo("/chat/greetins")
    public String onReceivedMessage(String message) {
        return message;
    }
}

Angular 2
import { Component, OnInit } from '@angular/core';
import   * as Stomp  from 'stompjs';
import  * as SockJS   from 'sockjs-client';
import * as $ from 'jquery';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
    private serverUrl = "/api/socket";
    private title = "WebSockets chat";
    private stompClient;

    constructor() {

    }

    ngOnInit() {
        this.initializeWebSocketConnection();   
    }

    initializeWebSocketConnection() {
        var ws = new SockJS(this.serverUrl);
        this.stompClient = Stomp.over(ws);
        let that = this;
        this.stompClient.connect({}, function(frame) {
            console.log("Connection Success.");
            that.stompClient.subscribe("/chat/greetings", (message) => {
                if (message.body) {
                    $(".chat").append("<div class='message'>" + message.body + "</div>");
                }
            });
        } );
    }

    sendMessage() {
        let message = $('#input').val(); 
        this.stompClient.send("app/send/message", {}, message);
        $('#input').val('');
    }
}

感谢帮助。

最佳答案

我通过在服务器端(Spring/Java)手动硬编码 SockJS 版本来修复它

@Override
public void registerStompEndpoints( StompEndpointRegistry registry ) 
{
     registry.addEndpoint( "/socket" )
        .setAllowedOrigins( "*" )
        .withSockJS( )
        .setClientLibraryUrl( "https://cdn.jsdelivr.net/sockjs/1.1.4/sockjs.min.js" ); 
}
更新:使用相对路径加载 JS 库(本地)
@Override
public void registerStompEndpoints( StompEndpointRegistry registry )
{
   registry.addEndpoint( "/socket" )
       .setAllowedOrigins( "*" )
       .withSockJS( )
       .setClientLibraryUrl( "../lib/sockjs-client/dist/sockjs.min.js" ); // Added
}

关于angular - 不兼容的 SockJS!主站使用: "1.1.4", iframe : "1.0.0". 怎么处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48524932/

相关文章:

java - 如何在多模块maven项目中单独运行多个模块

css - z-index iframe InternetExplorer 与 Chrome、Fox、

jquery - 如何通过jQuery暂停所有用户嵌入的YouTube视频?

django - 升级到 Django 3.2 LTS 后 iframe 停止工作

angular - ionic `<ion-img>` 不适用于 domSanitizer, "SafeValue must use [property]=binding"失败

angular - 如何在 [FromBody] ASP.NET CORE 2 和 Angular 5 中接收文件

使用 isDevMode 的 Angular AOT 给出错误

html - 如何在单击按钮时通过 Angular 7 进行自动对焦

spring - 记录 @Controller 请求 Spring Boot

java - Spring Boot OneToOne保存(): A different object with the same identifier value was already associated with the session