Spring websocket没有主体

2023-11-30

我正在尝试实现一个简单的 websockets 应用程序,该应用程序可以将消息从一个端点发送到在其他地方建立的指定会话。到目前为止,我已经能够使用注释 @SendToUser() 以便客户端订阅频道(如本问题中所述:Spring Websockets @SendToUser 无需登录?)

但是,我现在想要创建一个单独的端点,当调用该端点时,它会查找与传递到该端点的数据关联的用户,并向该用户发送有关该数据的消息。

但是,我无法准确确定如何制作它,以便我可以调用 SimpMessagingTemplate ConvertAndSendToUser() 命令,因为我的用户没有主体(我没有使用 Spring Security)。

我已经能够从传递到 @MessageMapping 端点的 MessageHeaders 中获取 simpSessionId,但现在我无法弄清楚如何使用 simpSessionId 从应用程序的不同部分发送信息。

我已经做了一些关于覆盖 DefaultHandshakeHandler 的确定用户()方法并在成功的 websocket 握手时将随机生成的 UUID 作为用户名分配给用户的研究(如此问题的答案中所述:如何在 Spring 4 STOMP over WebSocket 配置中回复未经身份验证的用户?),但由于出现的主体为空,我不确定如何正确生成主体并将其分配给主体以供应用程序使用。

我基本上需要能够拥有匿名用户,并在他们创建 websocket 连接后从应用程序的不同部分向他们发送消息。


因此,对于面临类似问题的其他人,我实现了自己的 Primary 类:

package hello;

import java.security.Principal;
import java.util.Objects;

public class AnonymousPrincipal implements Principal {

    private String name;

    @Override
    public String getName() {
        // TODO Auto-generated method stub
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object another) {
        if (!(another instanceof Principal))
            return false;

        Principal principal = (Principal) another;
        return principal.getName() == this.name;

    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}

然后,我实现了我自己的 DefaultHandshakeHandler 版本:

package hello;

import java.security.Principal;
import java.util.Map;
import java.util.UUID;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.DefaultHandshakeHandler;

public class CustomHandshakeHandler extends DefaultHandshakeHandler {

    @Override
    protected Principal determineUser(ServerHttpRequest request,
            WebSocketHandler wsHandler, Map<String, Object> attributes) {
        Principal principal = request.getPrincipal();           

        if (principal == null) {
            principal = new AnonymousPrincipal();

            String uniqueName = UUID.randomUUID().toString();

            ((AnonymousPrincipal) principal).setName(uniqueName);
        }

        return principal;

    }

}

现在,当握手发生时,Websocket 会话会获取分配给它的主体,因此如果用户是匿名的,他们会分配一个匿名主体,这将允许我存储他们的名称(生成的 UUID)以供以后在应用程序的其他部分使用。

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

Spring websocket没有主体 的相关文章

随机推荐

  • Cassandra 如何处理 datastax java 驱动程序中的阻塞执行语句

    阻止 com datastax driver core Session 执行方法 public ResultSet execute Statement statement 对这个方法的评论 该方法会阻塞 直到至少收到一些结果为止 数据库 但
  • 如何在sqlalchemy中使用多对多

    我想在我的项目中使用 sqlalchemy 的关系 我在简单的代码上测试多对多 from sqlalchemy import Table Column Integer String Text DateTime ForeignKey crea
  • .NET Core 动态属性的 json 序列化 (ExpandoObject)

    我在 NET Core 1 0 中有一个 Web api 我喜欢属性默认序列化为的新功能驼色肠衣代替帕斯卡套管 但是 我的一些 api 方法正在返回dynamic or ExpandoObject这些属性按原样序列化 这意味着如果我将它们作
  • Magento 扩展需要覆盖模板

    我正在为我的商店开发一个简单的扩展 它需要覆盖模板文件 相关模板用于生成订单中项目列表中的每个行项目 要查看我所说的内容 您可以转到 我的帐户 gt 我的订单 选择一个订单 然后向下滚动以查看 订购的商品 下的表格 我尝试替换的默认模板文件
  • Python,Mechanize - 即使在 set_handle_robots 和 add_headers 之后,robots.txt 也不允许请求

    我制作了一个网络爬虫 它获取所有链接直到页面的第一层 并从中获取所有链接和文本以及图像链接和 alt 这是完整的代码 import urllib import re import time from threading import Thr
  • 远程分区 - 从属变得贪婪

    以下是我们正在努力实现的目标 我们希望将一个大的 xml 文件并行地暂存在不同虚拟机的数据库中 为了实现这一目标 我们使用可扩展的 Spring Batch 远程分区方法 但我们遇到了一些问题 以下是高级设置 master 将 xml 文件
  • 按类名删除父 div - jquery

    我有一个删除链接 可以删除我页面上的当前评论 它使用ajax来更改数据库 成功后 我想删除评论所在的div 页面上的每个评论如下所示 div class aComment span class commentTitle Posted by
  • 如何将从 S3 使用 Rusoto 下载的文件保存到我的硬盘?

    我正在尝试使用 Rusoto 从存储桶下载文件 并获取文件内容 fn get object client TestClient bucket str filename str let get req GetObjectRequest buc
  • 更改复选框选中和取消选中时的复选框背景颜色

    我在 gridview 中有一个复选框 我想在选中和取消选中时更改该复选框的背景色
  • 如何通过 Python 3.5.1 创建永久 MS Access 查询?

    我有大约 40 个 MS Access 数据库 如果需要创建 MS Access 查询 如对象 之一或将其从一个数据库传输到其他数据库 则会遇到一些麻烦 所以我尝试解决这个问题pyodbc但是 正如我所见pyodbc不支持创建新的 永久的
  • 运行 DockerFile 创建并使用 pg_restore 恢复转储时出现错误

    我的 init sql 文件是 CREATE USER postgres WITH PASSWORD 123qwe CREATE DATABASE gmta database GRANT ALL PRIVILEGES ON DATABASE
  • 如何从 GradientDrawable 获取颜色

    首先 我将绿色设置为View mIcon的背景 View mIcon findViewById R id xxx GradientDrawable gdraw GradientDrawable mContext getResources g
  • 制作类的动态数组的独立副本

    我想创建涉及类 而不是记录 的 DynamicArrays 的独立副本 我使用的是德尔福XE5 在下面的示例代码中 完成所有分配后 动态数组的所有副本都包含相同的值 它已被解释在 复制 不会创建动态数组的独立副本由于涉及类 这是预期的行为
  • 具有 3 个边界和半径的容器

    我正在寻找只用创建圆形容器的方法左上和右上半径和without底部边框 这是我尝试过的 Container decoration BoxDecoration border Border left BorderSide color AppCo
  • 调用 eval 两次时,数据集会重新复制到 GPU(导致内存不足)

    这是我的一堆代码 I train a model save it and then clear all with del model tf keras backend clear session gc collect print f mem
  • 是什么让静态变量只初始化一次?

    我注意到 如果您在代码中初始化 C 中的静态变量 则初始化仅在您第一次运行该函数时运行 这很酷 但是它是如何实现的呢 它是否会转化为某种扭曲的 if 语句 如果给定一个值 那么 void go int x static int j x co
  • 为什么 LINQ 生成的 SQL 包含同一列的多个“IS NULL”条件

    使用 Entity Framework Core 3 1 对 SQL Server 2012 数据库进行以下查询 var tows await context DataEntryTow Where t gt context DataEntr
  • 从 java 检查服务可用性

    如何使用java检查服务 我发现本文 但它仅用于检查主机名 我的问题是如何检查端口 x 上的服务是否正在运行 例如 myhostname 8080 or myhostname 8099 我可能在这些端口上运行服务 n 或 p 但如果我手动执
  • 为 Google Cloud 端点设置指标

    我想在生产服务器上设置 Google Cloud 端点 分析请求的好方法是什么 Appstats仅支持 WSGI 请求 提前致谢 我实际上可以解决这个问题 深入研究端点 我可以发现它实际上是一个 WSGI 服务器 并用 Appstats 对
  • Spring websocket没有主体

    我正在尝试实现一个简单的 websockets 应用程序 该应用程序可以将消息从一个端点发送到在其他地方建立的指定会话 到目前为止 我已经能够使用注释 SendToUser 以便客户端订阅频道 如本问题中所述 Spring Websocke