stomp 连接错误: Whoops! Lost connection to http://localhost:8080/spring13/stomp 的解决方法

2023-05-16

【0】README

1)本文旨在给出 stomp 连接错误: Whoops! Lost connection to http://localhost:8080/spring13/stomp 的解决方法;you can also refer to this link http://stackoverflow.com/questions/29247956/whoops-lost-connection-to-undefined-connection-lost-just-after-the-connection.

2)解决问题后,文末给出了 STOMP client 的配置 和 springmvc 支持STOMP 的配置 ;


【1】错误 和 解决方法

1)error info


2)solution: 添加 jackson 的jar 包 到spring 项目中 即可。




【2】STOMP client 和 STOMP server(springmvc 配置以支持STOMP)

【2.1】STOMP client(websockjs.jsp)

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>

<html lang="zh-CN">
<head>
    <title>Hello WebSocket</title>
    <script src="<c:url value="/resources/sockjs-1.1.1.js" />"></script>
    <script src="<c:url value="/resources/stomp.js" />"></script>
    <script type="text/javascript">
        var stompClient = null;
        
        function setConnected(connected) {
            document.getElementById('connect').disabled = connected;
            document.getElementById('disconnect').disabled = !connected;
            document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
            document.getElementById('response').innerHTML = '';
        }

        function connect() {
        	var url = "<c:url value='/stomp' />";  
        	var sock = new SockJS(url); // 创建 SockJS 连接;SockJS 可以接收相对url;  
        	var stomp = Stomp.over(sock); // 创建 STOMP 客户端,显然,它们是一层一层封装的.  
        	var payload = JSON.stringify({ 'name': 'tangrong' });  
			
        	stomp.connect({}, function(frame) { // 连接 STOMP 端点;
        		setConnected(true);
                console.log('Connected: ' + frame);
                stomp.subscribe('/topic/response', function(calResult){
                	showResult(JSON.parse(calResult.body).content);
                });
        	});  
        }

        function disconnect() {
            if (stompClient != null) {
                stompClient.disconnect();
            }
            setConnected(false);
            console.log("Disconnected");
        }

        function sendName() {
            var name = document.getElementById('name').value;
            stompClient.send("/app/stomp", {}, JSON.stringify({ 'name': name }));
        }

        function showGreeting(message) {
            var response = document.getElementById('response');
            var p = document.createElement('p');
            p.style.wordWrap = 'break-word';
            p.appendChild(document.createTextNode(message));
            response.appendChild(p);
        }
    </script>
</head>
<body οnlοad="disconnect()">
<noscript>
	<h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable
    Javascript and reload this page!
    </h2>
</noscript>
<div>
    <div>
        <button id="connect" οnclick="connect();">Connect</button>
        <button id="disconnect" disabled="disabled" οnclick="disconnect();">Disconnect</button>
    </div>
    <div id="conversationDiv">
        <label>What is your name?</label><input type="text" id="name" />
        <button id="sendName" οnclick="sendName();">Send</button>
        <p id="response"></p>
    </div>
</div>
</body>
</html>

【2.2】STOMP server(springmvc 配置以支持STOMP)

1)WebConfig.java

package com.spring.spittr.web;

import java.io.IOException;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;

@Configuration
@ComponentScan(basePackages = { "com.spring.spittr.web" })
@EnableWebMvc
@Import({WebSocketConfig.class}) // 引入 WebSocketConfig 的配置,下面声明了。
public class WebConfig extends WebMvcConfigurerAdapter {

	@Bean
	public TilesConfigurer tilesConfigurer() {
		TilesConfigurer tiles = new TilesConfigurer();
		tiles.setDefinitions(new String[] { "/WEB-INF/layout/tiles.xml" });
		tiles.setCheckRefresh(true);
		return tiles;
	}
	
	// config processing for static resources.
	@Override
	public void configureDefaultServletHandling(
			DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	
	// InternalResourceViewResolver 
	@Bean
	public ViewResolver viewResolver1() {
		TilesViewResolver resolver = new TilesViewResolver();
		return resolver;
	}
		
	@Bean
	public ViewResolver viewResolver2() {
		InternalResourceViewResolver resolver = new InternalResourceViewResolver();
		resolver.setPrefix("/WEB-INF/views/");
		resolver.setSuffix(".jsp");
		resolver.setExposeContextBeansAsAttributes(true);
		resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
		return resolver;
	}

	@Bean
	public MessageSource messageSource() {
		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		messageSource.setBasename("messages"); 
		return messageSource;
	}

	@Bean
	public MultipartResolver multipartResolver() throws IOException {
		CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
		multipartResolver.setUploadTempDir(new FileSystemResource("/WEB-INF/tmp/spittr/uploads"));
		multipartResolver.setMaxUploadSize(2097152);
		multipartResolver.setMaxInMemorySize(0);
		return multipartResolver;
	}
}

2)WebSocketConfig.java

package com.spring.spittr.web;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
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
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

  @Override
  public void configureMessageBroker(MessageBrokerRegistry config) {
      config.enableSimpleBroker("/topic", "/queue");
      config.setApplicationDestinationPrefixes("/app");
      // 应用程序以 /app 为前缀,而 代理目的地以 /topic 为前缀.
      // js.url = "/spring13/app/hello" -> @MessageMapping("/hello") 注释的方法.
  }

  @Override
  public void registerStompEndpoints(StompEndpointRegistry registry) {
      registry.addEndpoint("/stomp").withSockJS();
      // 在网页上我们就可以通过这个链接 /server/app/hello 来和服务器的WebSocket连接
  }
}

3)GreetingController.java

package com.spring.spittr.web;

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

import com.spring.pojo.Greeting;
import com.spring.pojo.HelloMessage;

@Controller
public class GreetingController {
	
	@MessageMapping("/stomp")
	@SendTo("/topic/response")
	public Greeting greeting(HelloMessage message) throws Exception {
		System.out.println("receiving " + message);
		System.out.println("connecting successfully.");
		return new Greeting("Hello, " + message.getName() + "!");
	}
}

4)SpitterWebInitializer.java

package com.spring.spittr.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import com.spring.spittr.web.WebConfig;
import com.spring.spittr.web.WebSocketConfig;

public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

	@Override
	protected Class<?>[] getRootConfigClasses() {
		return new Class<?>[] { RootConfig.class };
	}

	@Override
	protected Class<?>[] getServletConfigClasses() {
		return new Class<?>[] { WebConfig.class };
	}


	@Override
	protected String[] getServletMappings() {
		return new String[] { "/", "*.js", "*.css", "*.jpg", "*.png", "/app/*", "*.map" };
	} // 特别注意,这里配置不拦截的url。特别是 "/app/*"
}


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stomp 连接错误: Whoops! Lost connection to http://localhost:8080/spring13/stomp 的解决方法 的相关文章

  • 当 edmx 文件位于单独的项目中时出错

    我有问题说 在配置中找不到指定的命名连接 或者不打算与EntityClient提供者 或无效 我的 edmx 文件位于单独的项目中 但该项目的连接字符串app config 什么可能导致问题 确保 app config 位于设置为启动项目的
  • 如何通过 HTTP POST 发送充满对象的 NSArray?

    我在 iPhone 端有一个产品 购物清单 由具有名称 product id 等的产品对象组成 我希望将此列表发送到服务器 在那里我将服务器上的列表与 iphone 中的列表进行比较 以合并所做的更改并将合并的列表发送回 iphone 如何
  • Angular4如何使用flatMap链接forkJoin

    我所处的情况是 我需要进行 5 个可以并行执行的 http 调用 在这五个调用之后需要执行另一个 http 调用 我在前 5 个中使用了 forkJoin 但我不知道如何链接 flatMap 或其他函数 forkJoin firstObse
  • 是否有管理 __utma、__utmz 等 cookie 的标准?

    无论我登录 Facebook 还是 Twitter 我都会受到以下名称的 cookie 轰炸 utma utmb utmc utmv 它们的功能是什么 是否有一个标准来管理这些在服务器端的使用方式 这些 cookie 通常与谷歌分析 htt
  • 如何使用独立的 Jetty 进行服务器推送

    我正在尝试使用独立的 Jetty 在静态网站上测试服务器推送功能 我的网站由一个index html 1个CSS 一堆图像组成 目录结构为 Album index html style css images image 1 png a se
  • iPhone Simulator - 模拟慢速连接?

    有没有办法减慢 iPhone 模拟器的互联网连接速度 以便模拟当您处于蜂窝网络速度较慢的位置时应用程序的反应 如何安装 Apple 的网络链接调节器 这些说明截至 2019 年 10 月有效 警告 如果您刚刚升级到新版本的 macOS 确保
  • 为什么 [response ExpectedContentLength] 总是返回 -1

    void connection NSURLConnection connection didReceiveResponse NSURLResponse response UIApplication sharedApplication net
  • Chrome 在传输一定量的数据后挂起 - 等待可用的套接字

    我有一个浏览器游戏 最近我开始向游戏添加音频 Chrome 无法加载整个页面并卡在 91 requests 8 1 MB transferred 并且不再加载任何内容 它甚至破坏了所有其他选项卡中的网站 说Waiting for avail
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 是否可以修改 $_SESSION 变量?

    恶意用户是否可以将 SESSION 在 php 中 变量设置为他想要的任何值 很大程度上取决于您的代码 有一点非常明显 SESSION username REQUEST username
  • Android设备到PC的socket连接

    我面临着建立从 Android 设备到 PC 的特定端口的套接字连接的问题 例如8080 我只想创建一个套接字 它将连接到特定端口并在该端口上写入一些数据流 我为此目的编写了一些代码 但代码给了我一个例外 TCP Error java ne
  • 当会话令牌无效时,我应该使用什么状态代码?

    创建 Web 服务 RESTful 时 当会话令牌无效时我应该使用什么状态代码 目前我公司的人给我发了一个404 未找到 但我认为这是不正确的 因为资源存在 也许我应该使用 401 Unauthorized 你怎么认为 您建议我在这种情况下
  • 使用什么 API 在现有 MFC 应用程序中添加 HTTP 客户端支持?

    我最近接到一项任务 要添加与以下内容交互的能力网络地图服务 http en wikipedia org wiki Web Map Service到现有的 MFC 应用程序 我需要客户端 HTTP API 根据我的研究 领先的候选人似乎是CA
  • 使用 Http Post 发送图像

    我想使用 Http Post 将图像从 android 客户端发送到 Django 服务器 该图像是从图库中选择的 目前 我正在使用列表值名称 Pairs 将必要的数据发送到服务器并接收来自 Django 的 JSON 响应 是否可以对图像
  • 编写每个处理程序中间件

    我希望从处理程序中提取一些重复的逻辑 并将其放入一些每个处理程序的中间件中 特别是 CSRF 检查 检查现有会话值 即身份验证或预览页面 等 我读了关于此的几篇文章 http justinas org writing http middle
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • 浏览器显示 clojure 环中不存在 access-control-allow-origin 标头

    我通过客户端浏览器向服务器发出请求 如下所示https example com bar https example com bar 但出现错误 Access to XMLHttpRequest at https example com ba
  • 使用 Anypoint Studio (MULE) 在本地主机上找不到资源

    我尝试按照 MuleSoft 网站上建议的教程进行操作 我首先从这个例子开始
  • 检查 WebRTC 连接 - 可靠的方法

    我有一个实时视频聊天应用程序 并且使用支持 STUN TURN 和 UPD TCP 传输的 TURN 服务器 有时用户可以连接到网络blocksWebRTC 连接的端口和协议就这么多不可能发生 通常这些是公司网络 我想在用户尝试相互连接之前
  • 动态img(或视频)标签根本不加载资源,HTTP请求处于“待处理”状态

    我尝试使用以下方法在 Web 应用程序上加载资源时遇到一些问题img or videoHTML 标签 我在我的应用程序中使用 Angular 并动态设置src的参数img标签 使用ng src src 指示 没有那么多图像和资源需要加载 在

随机推荐