使用SockJS

时间:2015-09-04 08:30:19

标签: spring rest model-view-controller websocket sockjs

我有一个Spring MVC服务器,它提供了一堆REST端点以及一个websocket端点。除登录端点之外的所有内容都需要身份验我使用JWT验证来自客户端的请求。

当用户登录时,我返回包含JWT令牌的X-AUTH-TOKEN标头。然后,在每个请求到服务器的同一个头中传递此令牌。这一切都适用于REST端点,但我无法弄清楚如何在websocket上执行此操作。

我正在使用SockJS,当我打开连接时:

var socket = new SockJS('/socket/updates', null, {});

这会导致对/ socket / updates / info?t = xxx的GET请求返回403(因为默认情况下一切都需要auth)。

理想情况下,我只是在SockJS发出的任何XHR请求上发送我的X-AUTH-TOKEN标头,但我看不到任何添加标头的方法。

最糟糕的情况我可以改变SockJS这样做,但我想知道这个功能是否被故意遗漏了?我知道SockJS出于安全原因不支持cookie,但这不是我想要做的。

另外,为了测试,我确实允许信息端点具有匿名访问权限,但是它在一堆其他端点上进行了操作 - 简单地传递这些请求的auth详细信息比感觉更优雅在我的服务器安全中挖洞。

任何帮助表示感谢。

干杯

2 个答案:

答案 0 :(得分:2)

您无法从SockJS设置标头。不是因为SockJS没有此功能,而是因为浏览器制造商不会将此API公开给Javascript。参见:

https://github.com/sockjs/sockjs-client/issues/196

要获得解决方法,请参阅JSON Web Token (JWT) with Spring based SockJS / STOMP Web Socket

答案 1 :(得分:-1)

客户方:

stompClient.connect({headername:header}, function () {
                setConnected(true);
                stompClient.subscribe(request.topic, function (message) {
                    output(message.body);
                });
            });

服务器端:

StompHeaderAccessor accessor
                        = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

 String headervalue= accessor.getNativeHeader("your header name").get(0);