当前位置: 首页 > 知识库问答 >
问题:

Spring启动Web套接字中的实时通知

弓华茂
2023-03-14

在我的应用程序中,我需要向特定用户发送实时通知。我的WebSocketConfig类如下,

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
        @Override
        public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
            stompEndpointRegistry.addEndpoint("/websocket-example")
                    .withSockJS();
        }

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

大多数情况下,信息将由服务器端发送。因此,我没有设置应用程序目标。

在客户端,我订阅目标“/主题/用户”,

function connect() {
    var socket = new SockJS('/websocket-example');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/user', function (greeting) {
//            showGreeting(JSON.parse(greeting.body).content);
console.log("Received message through WS");
        });
    });
}

在我的一个RestController中,我有一个方法可以将消息广播给所有连接的客户端。

    @GetMapping("/test")
    public void test()
    {
        template.convertAndSend("/topic/user", "Hurray");
    }

在这部分之前,一切正常。我收到消息并正在登录控制台。

现在,如果我想只向特定用户发送通知,我必须使用template.convertAndSendToUser(String user, String目标,String消息)。但是我不明白我应该传递给user参数的内容。我将在哪里以及何时获得user

我问了几个与此相关的问题,但我不清楚这些概念。

共有2个答案

包修贤
2023-03-14

这个用户名是java的一部分。安全主要接口。每个StompHeaderAccessor或WebSocket会话对象都有一个此原则的实例,您可以从中获取用户名。它不是自动生成的<代码>它必须由服务器为每个会话手动生成

您可以在此处查看有关为每个会话生成唯一id的更多信息。

然后像这样使用:

@MessageMapping('/test')
public void test(SimpMessageHeaderAccessor sha)
{
  String userName = sha.session.principal.name;
  template.convertAndSend(userName, '/topic/user', "Hurray");
}
长孙鸿振
2023-03-14

在向用户发送任何消息之前,您需要首先通过服务器对其进行身份验证。有不同的方法可以做到这一点。Spring安全性是这里的一个关键短语

https://docs.spring.io/spring-security/site/docs/current/guides/html5/helloworld-boot.html

身份验证完成后,只需调用以下命令即可获取用户名:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();

https://www.baeldung.com/get-user-in-spring-security

 类似资料:
  • 这是我第一次和docker合作。我有一个laravel web套接字网站(php laravel postgresql),需要放入一个容器。如果我只是执行命令(没有docker): php工匠服务 php artisan WebSocket:服务 然后它成功地工作: Websockets仪表板http://127.0.0.1:8000/laravel-WebSocket 我做了一个docker安装

  • 我们的Spring Security配置是 我们的websocket配置是

  • 问题内容: 我想使用网络套接字在Laravel中实现网络通知。我尝试过推杆。这很容易,但是它是付费的。我还尝试了redis和socket.io,必须为其安装Horizo​​n。我正在运行Windows,但根据我对地平线的了解,无法在Windows上安装它。 所以我对推送通知非常困惑。我正在尝试至少一个星期,但尚未找到任何解决方案。我的前端在angluar 5 / android中,后端在Larav

  • 问题内容: 我试图理解SocketChannels和NIO。我知道如何使用常规套接字,以及如何制作一个简单的每客户端线程服务器(使用常规阻塞套接字)。 所以我的问题是: 什么是SocketChannel? 当使用SocketChannel而不是Socket时,我还能得到什么呢? 通道和缓冲区之间是什么关系? 什么是选择器? 文档中的第一句话是。那是什么意思? 我也阅读了本文档,但是不知何故…… 问

  • 目前,我支持具有以下体系结构的客户机,用于工业制造过程: 我已经在PC上设置了一个WAMP服务器和一个示例网页,我可以在PC上的任何浏览器上看到它作为“本地主机”。我知道如何通过WebView类向Android应用程序添加web浏览器视图。 但是我不知道如何让手机上的浏览器通过TCP连接看到PC上的WAMP服务器。我怎么把这两件事联系起来?

  • 我尝试了我在互联网上找到的每一个解决方案,现在我只是卡住了 这是我的Spring boot App_控制器: 这里是我的corsConfiguration: 以下是我的WebSocketConfiguration: 最后,这里是我连接此WebSocket的函数: 我试图添加@CrossOrigin(origins=“*”)和@CrossOrigins(origins=”)http://localh