Я создал приложение весенней загрузки, сгенерированное J-Hipster, и проект Angular 8. Я реализовал функциональность входа в систему, после входа в систему пользователь получает токен jwt. Поэтому каждый раз, когда пользователь запрашивает или вызывает любой API, этот токен идет в заголовках. В весенней загрузке я переопределил метод @doFilter для аутентификации api, извлекая токен из заголовка и проверяя их. Теперь я хочу использовать веб-сокет в приложении. Я написал базовый c метод подключения в angular проекте и простой проект на стороне весенней загрузки. Но всякий раз, когда я нажимаю кнопку подключения, я получаю сообщение об ошибке, например, требуется полная аутентификация в Eclipse IDE. Согласно моему исследованию, мы не можем отправлять заголовки, прикрепленные в топе. Поэтому, пожалуйста, я могу знать, как реализовать websocket в моем проекте
Angular код
_connect() {
console.log( sessionStorage.getItem('token'));
//connect to stomp where stomp endpoint is exposed
//let ws = new SockJS(http://localhost:8080/greeting);
let wso = new SockJS(this.webSocketEndPoint);
this.stompClient = Stomp.over(wso);
const _this = this;
_this.stompClient.connect({"Authorization": "Bearer " + sessionStorage.getItem('token')}, function (frame) {
_this.stompClient.subscribe(_this.topic, function (sdkEvent) {
_this.onMessageReceived(sdkEvent);
});
//_this.stompClient.reconnect_delay = 2000;
}, this.errorCallBack);
};
Классы весенней загрузки
@Configuration
@EnableWebSocketMessageBroker
public class WebsocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/api/ws/**").setAllowedOrigins("http://localhost:4200").withSockJS();
}
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception {
return new Greeting("Hello !");
}
}
@Override
public void doFilter(ServletRequest servletRequest, FilterChain f_chain, ServletResponse servletResponse)
throws IOException, ServletException {
HttpServletRequest rqust = (HttpServletRequest) servletRequest;
String tokenRecved = tokenCheck(rqust);
if (this.tokenProvider.validateToken(tokenRecved)) {
Authentication auth = this.tokenProvider.getAuthentication(tokenRecved);
SecurityContextHolder.getContext().setAuthentication(auth);
}
f_chain.doFilter(servletRequest, servletResponse);
}
private String tokenCheck(rqust rqst){
String bearerToken = rqst.getHeader(AUTHORIZATION_HEADER);
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}