Я создал приложение Spring со следующей структурой кода:
SocketConfig. java
@Configuration
@EnableWebSocketMessageBroker
public class SocketConfig extends AbstractWebSocketMessageBrokerConfigurer{ //implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.setApplicationDestinationPrefixes("/app").enableSimpleBroker("/queue", "/topic");
// config.setUserDestinationPrefix("/user");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// registry.addEndpoint("/questions").setHandshakeHandler(new CustomHandshakeHandler()).withSockJS();
registry.addEndpoint("/questions").setHandshakeHandler(new CustomHandshakeHandler()).withSockJS();
}
}
CustomHandshakeHandler. java
public class CustomHandshakeHandler 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
String uuid = UUID.randomUUID().toString();
try {
UserStorage.getInstance().setUser(uuid);
} catch (Exception e) {
System.out.println("Error while creating user: " + uuid);
}
return new UsernamePasswordAuthenticationToken(uuid, null);
};
}
SocketController. java
@Controller
public class SocketController {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate;
private static final Logger log = LoggerFactory.getLogger(SocketController.class);
/**
* Example of sending message to specific user using 'convertAndSendToUser()' and '/queue'
*/
@MessageMapping("/questions")
public String sendSpecific(String question,Principal user) throws Exception {
return question.toUpperCase();
}
}
коннектор. js
var stompClient = null;
function connect() {
var socket = new SockJS('/questions');
stompClient = Stomp.over(socket);
// $.ajax({
// url:'/connectMe',
// dataType:'json',
// });
stompClient.connect({}, function (frame) {
stompClient.subscribe("/topic/questions", function (response) {
console.log(JSON.parse(response.body).content);
});
});
}
function sendMessage() {
stompClient.send("/app/questions", {}, JSON.stringify({'message': $("#message").val()}));
}
function showMessage(message) {
$("#greetings").append("<tr><td>" + message + "</td></tr>");
}
$(function () {
connect();
$("form").on('submit', function (e) {
e.preventDefault();
});
$( "#send" ).click(function() { sendMessage(); });
});
пом. xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.random-chat-app</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>4.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-reactor-netty</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.7-1</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>sockjs-client</artifactId>
<version>1.0.2</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>stomp-websocket</artifactId>
<version>2.3.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Но я не могу увидеть данные пользователя, которые у меня были установлен в CustomHandshakeHandler в объекте пользователя в функции sendSpecifi c в контроллере. Кто-нибудь может сказать мне, почему это происходит?