Java SimpUserRegistry不包含任何会话对象

Java SimpUserRegistry不包含任何会话对象,java,spring-boot,websocket,Java,Spring Boot,Websocket,我不熟悉WebSocket。我一直在尝试使用SimpUserRegistry按主体查找会话对象。我编写了一个自定义握手处理程序,将匿名用户转换为经过身份验证的用户,并且我能够从Websocket会话对象访问主体名称 自定义握手处理程序的代码如下所示 import java.security.Principal; public class StompPrincipal implements Principal { private String name; public Sto

我不熟悉WebSocket。我一直在尝试使用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;
    }
}

处理者

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());
    }
}

因此,我创建了一个配置类,如下所示


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

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

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

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

编辑:

显示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
是一个由SpringWebSocket注册/提供的“基础架构bean”,您不应该直接实例化它

您的WebSocket弹簧配置正确吗

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

  • SimpUserRegistry
    spring消息传递导入
    依赖项:确保您的配置类用
    @EnableWebSocketMessageBroker
    注释

    正式文件:

  • 要支持Redis中已连接的用户,您可能需要创建一个新的SimpUserRegistry实现:
  • 公共类RedismPuserRegistry实现了SimpUserRegistry、SmartApplicationListener{
    私有最终再贴现模板;
    公共RedisSimpUserRegistry(RedisTemplate RedisTemplate){
    this.redisTemplate=redisTemplate;
    }
    [...]
    @凌驾
    ApplicationEvent上的公共无效(ApplicationEvent事件){
    //在事件类型上维护Redis集合
    //即SessionConnectedEvent/sessiondisconnectedevent
    }
    [...]
    }
    
    PS:config类上的
    @Controller
    注释是不必要的,除非在其中定义了端点

    在新评论后编辑:

    您可以查看
    DefaultSimpUserRegistry
    实现,了解如何执行

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

    @覆盖
    
    公共布尔支持SeventType(ClassI已经实现了websocket配置器,并在问题中添加了代码。你能看一下吗。是否有任何方法可以将这些存储在redis缓存中。我已经编辑了我的答案。你能再详细说明一下在ApplicationEvent中要做些什么吗。它会自动检测到诸如bean创建之类的事件吗?我应该使用Crudeposite吗我想将数据添加到redis collection?我怎样才能访问websocket对象,我应该从websocketHandler的afterConnectionEstablished方法获取它?我一直在做一些研究,它说websocket会话不可序列化,因此将其添加到redis是个问题。如果你能说出你的想法,那将非常有帮助这上面有什么。
    @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());
        }
    }