5

I am using spring boot 2.1.6 RELEASE, trying to use Stomp websockets for push notifications. I have taken reference from here : https://github.com/netgloo/spring-boot-samples/tree/master/spring-boot-web-socket-user-notification

Things work fine in my local. When deployed to server with an HTTPS connection, all I see is this in the log.

Handshake failed due to invalid Upgrade header: null

and on the browser

Websocket.js:6 WebSocket connection to 'wss://dev.myserver.in/ws/055/chbvjkl4/websocket' failed

I went through dozens of stackoverflow posts and almost everyone is using proxy server. I am not using any proxy servers. (Please let me know if I should be using one and why)

The code snippets:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

}

Here is how I have allowed the websocket requests for now

@Override
    public void configure(WebSecurity web) throws Exception {

        // Tell Spring to ignore securing the handshake endpoint. This allows the
        // handshake to take place unauthenticated
        web.ignoring().antMatchers("/ws/**");

    }

The Push notification service which will be invoked on a particular action:

@Service
public class PushNotificationService {

    @Autowired
    private SimpMessagingTemplate simpMessagingTemplate;
    
    /**
     * Send notification to users subscribed on channel "/user/queue/notify".
     * The message will be sent only to the user with the given username.
     * 
     * @param notification The notification message.
     * @param username     The username for the user to send notification.
     */
    public void sendPushNotification(Notifications notification, String username) {
        simpMessagingTemplate.convertAndSendToUser(username, "/queue/notify", notification);
        return;
    }
}

On the front end:

function connect() {
        // Create and init the SockJS object
        var socket = new SockJS('/ws');
        var stompClient = Stomp.over(socket);

        // Subscribe the '/notify' channel
        stompClient.connect({}, function(frame) {
          stompClient.subscribe('/user/queue/notify', function(notification) {
            notify(JSON.parse(notification.body));

          });
        });

And here is the notify

function notify(message) {
    let notificationTitle = message.status;
    let body = message.createdOn;
    let link = message.url;
    if(Notification.permission === "granted") {
        showPushNotification(notificationTitle,body,link);
    }
    else {
        Notification.requestPermission(permission => {
            if(permission === 'granted') {
                showPushNotification(notificationTitle,body,link);
            }
        });
    }
}
Vishal_Kotecha
  • 481
  • 5
  • 19

1 Answers1

0

if you not use like nginx proxy, you should configure spring boot support https.

vishun
  • 79
  • 6