Java SimpUserRegistry不包含任何会话对象
我不熟悉WebSocket。我一直在尝试使用SimpUserRegistry按主体查找会话对象。我编写了一个自定义握手处理程序,将匿名用户转换为经过身份验证的用户,并且我能够从Websocket会话对象访问主体名称 自定义握手处理程序的代码如下所示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
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
注释
正式文件:
公共类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());
}
}