package com.qky.qingchi.config;
import com.qky.qingchi.config.filter.UserMessageInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/queue", "/topic");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/webSocketServer").setAllowedOrigins("*").withSockJS();
}
/**
* 配置客户端入站通道拦截器
*/
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new UserMessageInterceptor());
}
}
package com.qky.qingchi.config.filter;
import com.qky.qingchi.config.websocket.WebSocketUser;
import com.qky.qingchi.util.TokenUtils;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.simp.stomp.StompCommand;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.messaging.support.ChannelInterceptorAdapter;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class UserMessageInterceptor extends ChannelInterceptorAdapter {
@Resource
private RedisMessageListenerContainer redisContainer;
@Resource
private RedisConnectionFactory connectionFactory;
@Resource
private MessageListenerAdapter messageListener;
@Resource
private ChannelTopic topic;
@Resource
private String qkyname;
/**
* 获取包含在stomp中的用户信息
*/
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
StompHeaderAccessor accessor =
MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);
System.out.println(accessor.getLogin());
System.out.println(accessor.getCommand());
System.out.println("-----------------------");
System.out.println(redisContainer);
System.out.println(messageListener);
System.out.println(topic);
System.out.println(qkyname);
System.out.println("-----------------------");
System.out.println("触发websocket连接");
//1. 判断是否首次连接请求
if (StompCommand.CONNECT.equals(accessor.getCommand())) {
//2. 验证是否登录
String token = accessor.getNativeHeader("token").get(0);
System.out.println(token);
if (TokenUtils.isCorrect(token)) {
String phoneNumber = TokenUtils.getPhoneNumByToken(token);
accessor.setUser(new WebSocketUser(phoneNumber));
/* RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(messageListener, new ChannelTopic(phoneNumber));*/
return message;
} else {
return null;
}
}
//不是首次连接,已经成功登陆
return message;
}
}
package com.qky.qingchi.config.redis;
import com.qky.qingchi.util.UserUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import javax.annotation.Resource;
@Configuration
public class RedisSubListenerConfig {
@Resource
private SimpMessagingTemplate messagingTemplate;
@Bean
MessageListenerAdapter messageListener() {
//abstract methods overwrite
return new MessageListenerAdapter((MessageListener) (message, pattern) -> {
System.out.println("Message received: " + message.toString());
//message中带user信息,然后根据user推送message
// replyUser.getUsername()
messagingTemplate.convertAndSendToUser(UserUtils.getUser().getPhoneNum(), "/queue/notifications", message);
});
}
@Bean
RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container
= new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(messageListener(), topic());
return container;
}
@Bean
ChannelTopic topic() {
return new ChannelTopic("messageQueue");
}
@Bean("qkyname")
public String qkyname() {
System.out.println("注册秦开远名字bean");
return "qinkaiyuan";
}
}
注入的内容在其他类都是可以获得的,就在这个类里面无法获取,这是为什么啊
找到问题了,因为UserMessageInterceptor是我自己new出来的,不是spring管理的