标签: spring-websocket

Spring Boot - 将消息推送到 Angular UI

我想开发一个应用程序,我想将消息(或数据)从后端 Spring boot 应用程序推送到 UI。

我有以下要求 -

  1. 假设有一个 REST 服务使用 POST 方法接受来自其他应用程序的数据。
  2. 该数据将被推送到 UI。

或者

考虑有一个正在运行的后台进程会生成事件,并且我们希望将这些事件推送到 UI。

为此,我遇到了可以在 Spring Boot 应用程序中使用的 WebSocket 组件。

但是,是否需要任何其他设置才能将传入数据推送到 UI?

任何帮助表示赞赏。

谢谢,

阿维纳什·德什穆克

spring spring-boot spring-websocket

2
推荐指数
1
解决办法
8723
查看次数

SimpMessagingTemplate 没有合格的 bean 类型

我正在尝试在我的项目中使用该类SimpMessagingTemplate通过 websocket 发送一些数据。问题是我总是出错,这是完整的错误:

Error creating bean with name 'webSocketUserNotificationManagerImpl' defined in URL [...]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.messaging.simp.SimpMessagingTemplate' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Run Code Online (Sandbox Code Playgroud)

这是webSocketuserNotificationManagerImpl服务:

@Service
public class WebSocketUserNotificationManagerImpl implements UserNotificationManager {

    /**
     * Template to use to send back a message to the user via Web-socket.
     */
    private SimpMessagingTemplate template;

    public WebSocketUserNotificationManagerImpl(SimpMessagingTemplate template) {
        this.template …
Run Code Online (Sandbox Code Playgroud)

spring spring-websocket

2
推荐指数
1
解决办法
3038
查看次数

Spring Boot 在 WebSocket 上使用 Stomp:由于升级标头无效,握手失败:null

我在 Spring Boot 应用程序中使用 ws(非安全 WebSocket)。一旦客户端尝试连接到服务器,就会出现以下错误:

\n

Handshake failed due to invalid Upgrade header: null

\n

Spring Boot 应用程序在 Apache 代理后面的 Ubuntu 服务器上运行。Apache配置如下:

\n
<VirtualHost *:80>\n    DocumentRoot /var/www/myapp/public/\n    ServerAdmin webmaster@localhost\n    ServerName  app.myapp.biz\n\n    RewriteEngine       On\n    RewriteCond         %{HTTP:Upgrade}^websocket$ [NC,OR]\n    RewriteCond         %{HTTP:Connection}^upgrade$ [NC]\n    RewriteRule         .* "ws:/127.0.0.1:8096/$1" [P,QSA,L]\n\n    ProxyPreserveHost   On\n    ProxyRequests       Off\n    ProxyPass           / http://127.0.0.1:8096/\n    ProxyPassReverse    / http://127.0.0.1:8096/\n    RequestHeader       set X-Forwarded-Proto http\n    RequestHeader       set X-Forwarded-Port 80\n\n    SetEnv mongo_username           aUser\n    SetEnv mongo_password           aPassword\n</VirtualHost>\n
Run Code Online (Sandbox Code Playgroud)\n

application.properties的如下:

\n
debug=false\nserver.port=8096\nserver.address=127.0.0.1\n\nserver.forward-headers-strategy=native\nserver.tomcat.use-relative-redirects=true\nserver.tomcat.remoteip.protocol-header=x-forwarded-proto\nserver.tomcat.remoteip.remote-ip-header=x-forwarded-for\nserver.tomcat.remoteip.port-header=x-forwarded-port\n
Run Code Online (Sandbox Code Playgroud)\n

当在我的开发机器上运行应用程序时,一切正常。一旦部署到服务器上就会出现上述错误。我\xe2\x80\x99已经用谷歌搜索了很多,但无法\xe2\x80\x99找到针对这个问题的具体内容。我希望有人能帮帮忙。

\n

信息:尝试连接的前端应用程序是一个 Angular 应用程序,使用 …

java apache spring spring-websocket angular

2
推荐指数
1
解决办法
3053
查看次数

Spring Stomp @SendToUser与未经身份验证的用户无法正常工作

我正在尝试回复未经身份验证的用户使用@SendToUser.

  • 春季4.1.1

我正在使用新创建的Spring Boot应用程序,我唯一的配置是:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic");
        registry.setApplicationDestinationPrefixes("/app");
        registry.setUserDestinationPrefix("/user"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器代码:

@MessageMapping("/search")
@SendToUser("/search")
public String search(@Payload String xxx) {
    return "TEST1234";
}
Run Code Online (Sandbox Code Playgroud)

JS:

var socket = new SockJS('/webapp/stomp');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
    stompClient.subscribe('/user/search', function(data){
        alert(data.body);
    });
});
Run Code Online (Sandbox Code Playgroud)

弹簧输出:

DEBUG  org.springframework.web.servlet.DispatcherServlet: 996 - Successfully completed request
DEBUG   o.s.w.s.handler.LoggingWebSocketHandlerDecorator:  45 - New WebSocketServerSockJsSession[id=shizav88]
DEBUG       o.s.m.simp.broker.SimpleBrokerMessageHandler: 158 - …
Run Code Online (Sandbox Code Playgroud)

spring stomp spring-mvc spring-messaging spring-websocket

1
推荐指数
1
解决办法
6321
查看次数

Spring Websocket Security:如何防止直接向代理发送请求

Spring Websocket 允许客户端(即浏览器)直接将消息发送到任何代理支持的目的地,即允许绕过服务器端应用程序进行直接的客户端到客户端通信。在现实世界中,我认为直接向消息代理公开公开写入访问权限是不可接受的。出于安全和消息完整性的原因,您通常希望只允许服务器应用程序通过代理向客户端发送任何消息。但我找不到任何有关如何实现这一目标的信息。默认行为是浏览器对代理目标具有不受限制的读+写直接访问权限。

spring websocket spring-websocket

1
推荐指数
1
解决办法
1518
查看次数

如何使用spring websocket实现访问@MessageMapping方法中的请求对象

我正在将现有的弹簧MVC Web应用程序与弹簧腹板集成在一起.我按照说明成功地整合了

https://spring.io/guides/gs/messaging-stomp-websocket/

现有的Web应用程序有一个过滤器,它设置了一些属性.我需要在@MessageMapping方法中访问控制器i中的过滤器设置的属性.

有人可以告诉我们如何在@MessageMapping方法中访问请求对象?

spring spring-mvc spring-websocket

1
推荐指数
1
解决办法
2293
查看次数

如何从rest客户端调用Spring STOMP Web套接字方法

我的Java代码用URL/hello拦截所有调用(返回):

@Controller
public class GreetingController {

    @MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(3000); // simulated delay
        return new Greeting("Hello, " + message.getName() + "!");       
    }    
}
Run Code Online (Sandbox Code Playgroud)

我的JavaScript代码调用方法greeting()(Front):

function sendName() {
    var name = document.getElementById('name').value;
    stompClient.send("/app/hello", {}, JSON.stringify({ 'name': name }));
}
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何从Rest客户端调用@MessageMapping("/ hello")方法.我可以通过JavaScript代码连接,甚至可以获得响应并以HTML格式显示它.但我有一个要求,外部系统(通过休息调用)应该调用此@MessageMapping("/ hello"),然后应用程序(后端)应该发送对HTML的响应.我试图从chrome rest客户端插件调用@MessageMapping("/ hello")方法,但是没有成功.

请让我知道如何调用此方法?提前致谢

spring stomp rest-client sockjs spring-websocket

1
推荐指数
1
解决办法
4789
查看次数

@MessageMapping 返回上的 STOMP 标头

在我使用 Spring Websocket 的 Spring Boot 1.5 应用程序中,我想在方法的返回值上设置自定义 STOMP 标头@MessageMapping,但我不知道如何执行此操作。例如:

@Controller
public class ChannelController {

    @MessageMapping("/books/{id}")
    public Book receive(@DestinationVariable("id") Long bookId) {
        return findBook(bookId);
    }

    private Book findBook(Long bookId) {
        return //...
    }
}
Run Code Online (Sandbox Code Playgroud)

receive从客户端触发时STOMP SEND,我希望STOMP MESSAGE带有书体的回复框架有一个自定义标题:message-type:BOOK如下所示:

MESSAGE
message-type:BOOK
destination:/topic/books/1
content-type:application/json;charset=UTF-8
subscription:sub-0
message-id:0-7
content-length:1868

{ 
  "createdDate" : "2017-08-10T10:40:39.256", 
  "lastModifiedDate" : "2017-08-10T10:42:57.976", 
  "id" : 1, 
  "name" : "The big book", 
  "description" : null 
}
^@
Run Code Online (Sandbox Code Playgroud)

如何为 a 中的回复返回值设置 STOMP 标头@MessageMapping …

java spring stomp spring-boot spring-websocket

1
推荐指数
1
解决办法
3852
查看次数

如何在spring mvc中使用websocket检测客户端已断开连接

我希望能够检测到用户何时失去了与服务器的连接(关闭的选项卡、失去了互联网连接等)我在我的客户端上通过 Sockjs 使用 stompjs,在我的服务器上使用 spring mvc websockets。

我如何检测客户端何时失去连接。这是我如何配置我的 websocket 消息 brocket:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
    @Autowired
    private TaskScheduler scheduler;

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic").setHeartbeatValue(new long[]{10000, 10000}).setTaskScheduler(scheduler);
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/web").setAllowedOrigins("*").withSockJS();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我的控制器类,它实际上处理传入的套接字消息:

@RestController
@CrossOrigin
public class WebMessagingController {

    @MessageMapping("/chat/message")
    public void newUserMessage(String json) throws IOException {
        messagesProcessor.processUserMessage(json);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道如果我使用从TextWebSocketHandler扩展的类,我将有 bean 能够覆盖在客户端连接和断开连接时调用的方法,但我认为这不适用于sock-js 客户端。谢谢你。

spring-mvc sockjs spring-websocket stompjs

1
推荐指数
1
解决办法
4730
查看次数

如何在java spring websocket中实现乒乓

根据此处的文档https://tools.ietf.org/html/rfc6455#page-37websocket必须ping使用pong.

我已经实现spring boot websocket处理websocket来自客户端的连接。

我有一个定期websocket发送的客户端ping frames

我在这里/sf/answers/1710682991/发现我无法在 java 中处理 ping 消息。

我对此有疑问-

  1. 我应该处理这些ping请求java spring-boot websocket吗?
  2. 如果是的话,我如何在 Spring Boot 应用程序中实现它并响应ping请求pong

java ping websocket spring-boot spring-websocket

1
推荐指数
1
解决办法
6756
查看次数

Websocket 客户端未收到任何消息

我有 Python 客户端,它打开到服务器的 websocket 连接并使用 STOMP 协议订阅特定主题,订阅进行得很好,因为我在服务器上看到一切都很好。但是,当服务器发布一些消息时,客户端不会收到任何消息。以下是使用的代码:

客户

# coding: utf-8
import websocket
import stomp
import stomper
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInByaW5jaXBhbF9uYW1lIjoiYWRtaW4iLCJpc3MiOiJBdGhlbmEiLCJ1c2VydHlwZSI6IkxPQ0FMIiwiYW9zX3ZlcnNpb24iOiJldXBocmF0ZXMtNS4xMS1zdGFibGUiLCJyZWdpb24iOiJlbi1VUyIsImV4cCI6MTczNDI4MDI3NywidXVpZCI6ImI4MzhjOGRkLWI4NmQtNGNkZS05ZTE4LTUxM2E1OTk4ODhhYyIsImlhdCI6MTU3NjYwMDI3NywiYXV0aG9yaXRpZXMiOiJST0xFX0NMVVNURVJfQURNSU4sUk9MRV9NVUxUSUNMVVNURVJfQURNSU4sUk9MRV9VU0VSX0FETUlOLFJPTEVfQ0xVU1RFUl9WSUVXRVIiLCJqdGkiOiI1NTU1ZjEwZC04NGQ5LTRkZGYtOThhNC1mZmI1OTM1ZTQwZWEifQ.LOMX6ppkcSBBS_UwW9Qo2ieWZAGrKqADQL6ZQuTi2oieYa_LzykNiGMWMYXY-uw40bixDcE-aVWyrIEZQbVsvA"
headers = {"Authorization": "Bearer " + token}
uri = "ws://127.0.0.1:8765/notifications/websocket"
def on_msg(ws, msg):
    print(msg)

def on_error(ws, err):
    print(err)

def on_closed(ws):
    print("#Closed#")

def on_open(ws):
    sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto")
    ws.send(sub)

headers = {"Authorization": "Bearer " + token}



websocket.enableTrace(True)
ws = websocket.WebSocketApp(uri, header=headers, on_message=on_msg, on_error=on_error, on_close=on_closed)
ws.on_open = on_open
ws.run_forever()
Run Code Online (Sandbox Code Playgroud)

代码服务器用于发布消息:

    for (WatchesSubscription s : subscriptions) {
            template.convertAndSendToUser(s.getSession().getUser(), destination, dto);
        }
Run Code Online (Sandbox Code Playgroud)

当我检查上述变量的值时,我看到目的地是预期的 …

python stomp websocket spring-websocket

1
推荐指数
1
解决办法
2067
查看次数

Spring Websocket践踏客户端如何捕获丢失的连接?

我使用spring websocket踩踏客户端。以下是代码片段?

List<Transport> transports = new ArrayList<Transport>(2);
transports.add(new WebSocketTransport(new StandardWebSocketClient()));
transports.add(new RestTemplateXhrTransport());

WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
headers.add("Cookie", client.getCookieString());

SockJsClient sockJsClient = new SockJsClient(transports);

WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new StringMessageConverter());
ListenableFuture<StompSession> future = 
   stompClient.connect(configuration.getApp().getWebsocketServerBase() + "/websocket/sa", headers, new MyWebSocketHandler());

future.addCallback(new SuccessCallback<StompSession>() {
    public void onSuccess(StompSession stompSession) {
        System.out.println("on Success!");
    }
}, new FailureCallback() {
    public void onFailure(Throwable throwable) {
        System.out.println("on Failure!");
    }
});
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是当websocket服务器关闭时,客户端不会收到该消息。

如何监听服务器关闭事件?

java spring spring-websocket

0
推荐指数
1
解决办法
4033
查看次数

SockJS是如何选择协议的?

我将首先从我所知道的开始,因为它可能对其他人有用。

很明显,您可以使用协议子集实例化 SockJS:

sockJsProtocols = ["xhr-streaming", "xhr-polling", ....];
socket.cliente = new SockJS(url, null, {transports: sockJsProtocols}));
Run Code Online (Sandbox Code Playgroud)

我还发现,当 SockJS 调用 /info 端点时,服务器返回 websockets true 或 false(取决于服务器兼容性)。

我还知道这里有一个漂亮的表,有 3 列:websockets、流式传输和轮询。

但我有两个问题:

1) SockJS 如何决定轮询、流式传输还是 websocket?它不能与浏览器兼容性有关,因为我在日志中看到许多使用最新浏览器的 XHRStreaming 会话。怎么这在任何地方都没有记录?

2)为什么SockJS每次都需要调用/info?服务器的兼容性将始终相同。

websocket sockjs spring-websocket

0
推荐指数
1
解决办法
1458
查看次数