【问题标题】:Spring stomp websockets with vue.js使用 vue.js 的 Spring stomp websockets
【发布时间】:2018-03-30 19:54:05
【问题描述】:

我正在尝试将 Spring websockets (STOMP) 与 Vue 一起使用,但不知道该怎么做,甚至不知道它是否可行。我的 websockets 可以使用普通的 JS,但是当我尝试使用 Vue 时我卡住了。这是我的vue代码:

var app = new Vue({
el: '#app',
data: {
    stompClient: null,
    gold: 0
},
methods: {
    sendEvent: function () {
        this.stompClient.send("/app/hello", {}, JSON.stringify({'name': $("#name").val()}));
    }
},
created: function () {
    this.stompClient = Stomp.over(new SockJS('/gs-guide-websocket'));
    this.stompClient.connect()
    this.stompClient.subscribe('/topic/greetings', function (greeting) {
        console.log(JSON.parse(greeting.body).content);
    });
},

})

我的连接和发送功能正在工作,我可以在后端看到消息,但问题是订阅功能。它需要一个回调函数,但这永远不会触发。我也尝试在 vue 中创建一个方法并调用它

this.stompClient.subscribe('/topic/greetings', vueFunc())

但这也不起作用。我在https://github.com/FlySkyBear/vue-stomp 找到了一些库,但我不知道如何使用它,它看起来真的很乱。那我宁愿用纯JS。

有人有解决办法吗?谢谢

【问题讨论】:

    标签: javascript spring vuejs2 stomp spring-websocket


    【解决方案1】:

    这是 Spring Boot Websocket (STOMP) 和 Vue CLI 的工作示例。 (更详细的描述在这里http://kojotdev.com/2019/07/using-spring-websocket-stomp-application-with-vue-js/

    1. https://spring.io/guides/gs/messaging-stomp-websocket/下载Spring Boot demo
    2. WebSocketConfig中添加允许的来源

      @Override
      public void registerStompEndpoints(StompEndpointRegistry registry) {
          registry.addEndpoint("/gs-guide-websocket")
                  .setAllowedOrigins("http://localhost:8081")
                  .withSockJS();
      }
      
    3. 运行项目

    现在启动 Vue CLI 项目并:

    1. 安装 SockJS npm install sockjs-client
    2. 安装 STOMP npm install webstomp-client
    3. 我使用引导类,所以你需要 npm install bootstrap@3 只是为了布局

    添加 .vue 组件:

    <template>
        <div>
            <div id="main-content" class="container">
                <div class="row">
                    <div class="col-md-6">
                        <form class="form-inline">
                            <div class="form-group">
                                <label for="connect">WebSocket connection:</label>
                                <button id="connect" class="btn btn-default" type="submit" :disabled="connected == true" @click.prevent="connect">Connect</button>
                                <button id="disconnect" class="btn btn-default" type="submit" :disabled="connected == false" @click.prevent="disconnect">Disconnect
                                </button>
                            </div>
                        </form>
                    </div>
                    <div class="col-md-6">
                        <form class="form-inline">
                            <div class="form-group">
                                <label for="name">What is your name?</label>
                                <input type="text" id="name" class="form-control" v-model="send_message" placeholder="Your name here...">
                            </div>
                            <button id="send" class="btn btn-default" type="submit" @click.prevent="send">Send</button>
                        </form>
                    </div>
                </div>
                <div class="row">
                    <div class="col-md-12">
                        <table id="conversation" class="table table-striped">
                            <thead>
                                <tr>
                                    <th>Greetings</th>
                                </tr>
                            </thead>
                            <tbody>
                                <tr v-for="item in received_messages" :key="item">
                                    <td>{{ item }}</td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </template>
    
    <script>
    import SockJS from "sockjs-client";
    import Stomp from "webstomp-client";
    
    export default {
      name: "websocketdemo",
      data() {
        return {
          received_messages: [],
          send_message: null,
          connected: false
        };
      },
      methods: {
        send() {
          console.log("Send message:" + this.send_message);
          if (this.stompClient && this.stompClient.connected) {
            const msg = { name: this.send_message };
            this.stompClient.send("/app/hello", JSON.stringify(msg), {});
          }
        },
        connect() {
          this.socket = new SockJS("http://localhost:8080/gs-guide-websocket");
          this.stompClient = Stomp.over(this.socket);
          this.stompClient.connect(
            {},
            frame => {
              this.connected = true;
              console.log(frame);
              this.stompClient.subscribe("/topic/greetings", tick => {
                console.log(tick);
                this.received_messages.push(JSON.parse(tick.body).content);
              });
            },
            error => {
              console.log(error);
              this.connected = false;
            }
          );
        },
        disconnect() {
          if (this.stompClient) {
            this.stompClient.disconnect();
          }
          this.connected = false;
        },
        tickleConnection() {
          this.connected ? this.disconnect() : this.connect();
        }
      },
      mounted() {
        // this.connect();
      }
    };
    </script>
    
    <style scoped>
    
    </style>
    

    运行项目并测试,它应该默认从8081端口开始。

    【讨论】:

    • 你是我的英雄。令人难以置信的是,标准教程中没有提到.setAllowedOrigins("*")。谢谢!
    • 任何关注这个答案的人,webstomp-client 的 send() 参数的顺序与 stompjs 不同,即使两者在教程中可以互换使用, send(dest , msg, headers) 用于 webstomp-client 和 send (dest , headers, msg) 用于 stompjs 和类似的
    【解决方案2】:

    我也是这种情况……

    这里似乎有一个可行的解决方案:

    https://github.com/ocinpp/springboot-sockjs-stomp-vue-sample

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 2017-02-16
      • 2014-02-24
      • 2015-12-16
      • 2016-01-28
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      相关资源
      最近更新 更多