SimpUserRegistry 不包含任何会话对象

2024-03-11

我是 Websockets 新手。我一直在尝试使用 SimpUserRegistry 来查找主体的会话对象。我编写了一个自定义握手处理程序,将匿名用户转换为经过身份验证的用户,并且我能够从 Websocket 会话对象访问主体名称。

自定义握手处理程序的代码如下所示


import java.security.Principal;

public class StompPrincipal implements Principal {
    private String name;

    public StompPrincipal(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }
}

Handler

class CustomHandshakeHandlerTwo extends DefaultHandshakeHandler {
    // Custom class for storing principal
    @Override
    protected Principal determineUser(
            ServerHttpRequest request,
            WebSocketHandler wsHandler,
            Map<String, Object> attributes
    ) {
        // Generate principal with UUID as name
        return new StompPrincipal(UUID.randomUUID().toString());
    }
}

但正如许多问题中所指定的那样this https://stackoverflow.com/questions/32211170/spring-4-2-0-how-to-use-simpuserregistry我无法注入SimpUserRegistry直接地。

它抛出错误


Field simpUserRegistry  required a bean of type 'org.springframework.messaging.simp.user.SimpUserRegistry' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.springframework.messaging.simp.user.SimpUserRegistry' in your configuration.


所以我创建了一个配置类,如下所示。


@Configuration
public class UsersConfig {
    final private SimpUserRegistry userRegistry = new DefaultSimpUserRegistry();

    @Bean
    @Primary
    public SimpUserRegistry userRegistry() {
        return userRegistry;
    }
}

现在我可以自动连接并使用它,但每次我尝试访问SimpUserRegistry它是空的。

造成这个问题的原因可能是什么?

EDIT:

显示 websocket 配置

@Configuration
@EnableWebSocket
@Controller
@Slf4j
public class WebSocketConfig implements WebSocketConfigurer {
    
    @Autowired
    EventTextHandler2 handler;
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        log.info("Registering websocket handler SocketTextHandler");
        registry.addHandler(handler, "/event").setHandshakeHandler(new CustomHandshakeHandlerTwo());
    }
}

SimpUserRegistry是 Spring WebSocket 注册/提供的“基础设施 bean”,您不应该直接实例化它。

你的WebSocket Spring配置正确吗?

  1. 确保您的应用程序配置良好(即正在扫描您的配置类)。

SimpUserRegistry是由进口的spring-messaging依赖项:确保您的配置类带有注释@EnableWebSocketMessageBroker.

官方文档:https://docs.spring.io/spring-framework/docs/5.3.6/reference/html/web.html#websocket-stomp-enable https://docs.spring.io/spring-framework/docs/5.3.6/reference/html/web.html#websocket-stomp-enable

  1. 要支持 Redis 中的连接用户,您可能需要创建一个新的 SimpUserRegistry 实现:
public class RedisSimpUserRegistry implements SimpUserRegistry, SmartApplicationListener {

  private final RedisTemplate redisTemplate;

  public RedisSimpUserRegistry(RedisTemplate redisTemplate) {
    this.redisTemplate = redisTemplate;
  }

  [...]

  @Override
  public void onApplicationEvent(ApplicationEvent event) {
    // Maintain Redis collection on event type
    // ie. SessionConnectedEvent / SessionDisconnectEvent
  }
  [...]
}

PS: The @Controller除非您在配置类中定义了端点,否则不需要在配置类上添加注释。

新评论后编辑:

您可以看到DefaultSimpUserRegistry实施以了解如何去做。

要拦截应用程序事件,您必须实现ApplicationListener接口(在本例中SmartApplicationListener). The supportsEventType方法对于定义要拦截的事件类型很重要:

  @Override
  public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
    return AbstractSubProtocolEvent.class.isAssignableFrom(eventType);
  }

The AbstractSubProtocolEvent有多种实现方式。最重要的是SessionConnectEvent, SessionDisconnectEvent.

拦截(参见onApplicationEvent方法)这些事件类型将允许您的实现在 Redis 缓存中维护所需的状态。然后您可以存储用户(id 等)。

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

SimpUserRegistry 不包含任何会话对象 的相关文章

  • Spring Security 自定义过滤器

    我想自定义 Spring security 3 0 5 并将登录 URL 更改为 login 而不是 j spring security check 我需要做的是允许登录 目录并保护 admin report html 页面 首先 我使用教
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring RestTemplate 使用 cookie 遵循重定向

    最近我遇到了一个问题 我需要做一个GET请求远程服务 我假设使用一个简单的 servlet 并且 RestTemplate 返回Too many redirects 经过一番调查 似乎对指定远程服务发出的第一个请求实际上只是一个 302 重
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 使用 JUnit 时,有没有办法验证测试方法中是否调用了 try/catch 指令的 Catch 部分?

    例如 如果我想测试以下课程 public class SomeClass public void someMethod try Some code where comething could go wrong catch Exception
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 是否可以使用 Java Guava 将函数应用于集合?

    我想使用 Guava 将函数应用于集合 地图等 基本上 我需要调整 a 的行和列的大小Table分别使所有行和列的大小相同 执行如下操作 Table
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • Photoshop 抠图滤镜是如何实现的?

    Photoshop 有很多很酷的功能艺术滤镜 http alanwho com photoshop photoshop artistic filters 我很想了解底层算法 一种特别有趣的算法是 Cutout 过滤器 上面链接中的编号 2
  • PostgreSQL 子查询使用 like

    假设我有第一张这样的桌子 分支表 name description 123456ABC FOO 553646DEF FO2 第二个表是这样的 余额表 name description ABC oof DEF 2of 我想查询余额表 其中每一
  • Windows Server 2008 的传真服务器替代方案

    为了在内部发送传真 我们一直使用以下 Coldfusion 代码来创建处理传真的对象
  • 查找 google 何时自动完成返回零结果

    我使用谷歌地点自动完成功能来提供地点建议 现在这就是我想要的 当用户输入不在谷歌数据库中的位置时 即谷歌返回零结果时 我需要能够捕获零结果事件 并触发我的客户自动完成功能 当谷歌返回零结果时我如何找到 如果结果为零 autocomplete
  • 构建 Apk 时出错:com.android.build.api.transform.TransformException:生成主 dex 列表时出错

    在项目到两个库模块和一个应用程序模块之后 Android Studio 无法构建 Apk 但是当我将项目构建到真实设备或模拟器中时 它可以完美运行 这是我在 消息 选项卡中遇到的完整堆栈错误 FAILURE Build failed wit
  • 是什么导致 HttpListener HTTP 503 错误?

    因此 我们有一个大型程序 它使用 HttpListener 来实现小型远程管理功能 由于我不明白的原因 有些人遇到了 503 错误的问题 由于我们没有提供错误 因此框架中发生了一些事情 现在 我的问题是 框架内部是什么导致了这个错误 是前缀
  • 创建 .p12 文件

    Using openssl 我创建了一个私钥 如下所示 openssl genrsa out myKey pem 然后 生成csr应CA的要求 我已执行以下操作 openssl req new key myKey pem out cert
  • 如何将 Istio Service Mesh 从 http 升级到 http2?

    我们使用 Kubernetes 并使用 Istio Service Mesh 目前 网关中存在针对 HTTPS 的 SSL 终止 我在 istio proxy 日志中看到 HTTP 协议是 HTTP 1 1 由于 HTTP2 的各种优点 我
  • 如何在python的tkinter中设置Treeview的宽度

    最近 我使用tkinter TreeView显示许多列Python 具体来说 树视图中有 49 列数据 我用grid管理我的小部件 我发现树视图的宽度仅取决于列的宽度 我的问题是 如何设置 Treeview 的宽度 默认宽度是所有列宽度的总
  • 循环地址对齐如何影响 Intel x86_64 上的速度?

    我发现相同的 C 代码编译为完全相同的机器指令但位于不同对齐的地址时性能下降了 15 当我的小主循环从 0x415220 开始时 它比从 0x415250 开始时要快 我在 Intel Core2 Duo 上运行它 我在 x86 64 Ub
  • 在 Mac OS 下设置 COBOL 编译器?

    在我的大学里 我们正在学习 COBOL 我正努力在明年上课之前抢先学习 COBOL C 和 Java 问题是 COBOL 是so旧的 很难在 mac 中获得对它的支持 我的笔记本电脑是 mac 我知道它在 Mac 上运行良好 但找到可以解释
  • 如何以全屏模式启动 NSWindow

    我正在 Xcode 5 中为 Macos 开发一个应用程序 我想全屏显示我的第一个窗口 没有工具栏 只有我的视图 我找到了一种在角落显示全屏按钮的方法 AppDelegate m void applicationDidFinishLaunc
  • BCL(基类库)与 FCL(框架类库)

    两者有什么区别 我们可以互换使用它们吗 基类库 BCL 字面意思就是基础 它包含基本的基本类型 例如System String and System DateTime 框架类库 FCL 是更广泛的库 包含全部内容 ASP NET WinFo
  • 使用 docker-compose 时无法连接到 postgres

    我是 docker 的新手 仍在学习如何使用它 我正在尝试使用 docker compose 一起运行 Django 和 Postgres 它们运行完美 迁移完成 一切顺利 但我有一个问题 无法使用 pgAdmin4 连接到数据库来查看数据
  • C# 序列化到文件,如果存在则覆盖

    我有以下方法 如下 您可以看到它将对象序列化为 XML 文件 我遇到的主要问题是我想获得覆盖文件 如果存在 的函数 我知道如果该文件确实存在 我可以先删除该文件 但这也意味着我可能会导致一些错误拖入我的应用程序 所以我想要一个全有或全无的覆
  • volley 磁盘缓存内存不足问题

    在我的 Android 应用程序中 我使用 Volley 在自定义列表视图中加载图像 当我多次刷新 删除所有项目并加载 tiem 列表视图时 我的应用程序被这条消息杀死 我该如何修复它 04 26 13 08 01 038 E dalvik
  • tmux:挂起并且不加载,并且不响应任何选项命令

    我已经在 Fedora 的本地空间上从源代码安装了 tmux 到目前为止 它运行良好 但突然无法再运行它 当运行 tmux 时 它就停止了 尝试了不同的命令选项 例如 ls sessions 但没有任何效果 杀死我的用户的所有进程 删除 t
  • maven 编译无法识别我的本地存储库依赖项

    我有一个本地 jar 文件要导入到我的文件夹中 并且我已经运行了 mvn install mvn install install file Dfile C myapp Development core target api core 1 0
  • 如何在启动 iex 会话时执行一些命令?

    假设我想在项目的根路径中启动 iex 时实现一些命令 例如 Logger configure level info require Ecto Query alias MyApp User and so on 我想在每次启动 iex 时自动执
  • SimpUserRegistry 不包含任何会话对象

    我是 Websockets 新手 我一直在尝试使用 SimpUserRegistry 来查找主体的会话对象 我编写了一个自定义握手处理程序 将匿名用户转换为经过身份验证的用户 并且我能够从 Websocket 会话对象访问主体名称 自定义握