Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java websocket get custom header in onOpen function

Tags:

java

websocket

In my websocket server I am retreiving a cutom header which I wan't link to the session it is from. I already got the a working ServerEndpointConfig.Configurator which looks like this:

public class WebSocketConfig extends ServerEndpointConfig.Configurator {

    private static final Logger LOG = LoggerFactory.getLogger(WebSocketConfig.class);

    @Override
    public void modifyHandshake(ServerEndpointConfig sec, HandshakeRequest request, HandshakeResponse response) {
        Map<String, List<String>> headers = request.getHeaders();
        if (headers != null) {
            if (headers.containsKey("key")) {
                List<String> header = headers.get("key");
                if (header.size() > 0) {
                    LOG.info(header.get(0));
                }
            }
        }
    }
}

My ServerEndpoint looks like this:

@ServerEndpoint(value = "/websocket", configurator = WebSocketConfig.class)
public class WebSocket {

    private static final Logger LOG = LoggerFactory.getLogger(WebSocket.class);

    public WebSocket() {
    }

    @OnOpen
    public void onOpen(Session session) {
        LOG.info("OnOpen");
    }

    @OnClose
    public void onClose(Session session) {
        LOG.info("OnClose");
    }

    @OnMessage
    public void onMessage(String message, Session session){
        LOG.info("OnMessage: " + message);
    }
}

In the function onOpen I want to save link the session to the header value. But how can I access it?

Regards.

like image 973
Mike Avatar asked Sep 25 '26 18:09

Mike


2 Answers

As per Oracle doc https://docs.oracle.com/javaee/7/tutorial/websocket010.htm

you need to update Endpoint Configuration properties in your Custom Configurator

conf.getUserProperties().put("key", value);

and then you can later access it in Endpoint public class MyEndpoint {

    @OnOpen
    public void open(Session s, EndpointConfig conf) {
        String value = conf.getUserProperties().get("key");
..
}
like image 67
Karmjit Avatar answered Sep 27 '26 07:09

Karmjit


I found a work around for my problem where I have to put a path parameter to the path.

Not sure if this is the best solution.

@ServerEndpoint(value = "/websocket/{key}", configurator = WebSocketConfig.class)
public class WebSocket {

    private static final Logger LOG = LoggerFactory.getLogger(WebSocket.class);

    public WebSocket() {
    }

    @OnOpen
    public void onOpen(Session session, @PathParam("key") String key) {
        LOG.info("OnOpen");
    }

    @OnClose
    public void onClose(Session session) {
        LOG.info("OnClose");
    }

    @OnMessage
    public void onMessage(String message, Session session){
        LOG.info("OnMessage: " + message);
    }
}
like image 35
Mike Avatar answered Sep 27 '26 07:09

Mike



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!