【问题标题】:Accessing Stomp Headers in Spring在 Spring 中访问 Stomp 标头
【发布时间】:2017-01-24 10:39:17
【问题描述】:

我想在 stomp 标头中设置一个用户名,并在握手期间将该用户名设置在 Principal 对象中。创建了我自己的 HandshakeHandler,但我无法在从 DefaultHandshakeHandler 覆盖的方法确定用户中获取该用户名。

任何帮助将不胜感激。这是相关代码-->

这是我的客户端代码 -->

var from = document.getElementById('username').value;
var socket = new SockJS('/WebSocketsChat/chat');
stompClient = Stomp.over(socket);  

stompClient.connect({userName:from,sampleMsg:"Hello"},    
function(frame) {   
// Some more code here

这是我的 HandShakeHandler -->

 @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
         registry.addEndpoint("/chat").setHandshakeHandler(new RandomUserNameHandshakeHandler()).withSockJS();
    }


 private class RandomUserNameHandshakeHandler extends DefaultHandshakeHandler{

     @Override
     protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler, Map<String,Object> attributes){

         // Some Code that would give me the username set in Stomp Header
         // For now i am randomly generating a username and setting in principal.
         String username = "user"+"-"+ new Random().nextInt(100);
         return new UsernamePasswordAuthenticationToken(username,null);

     }
 }

【问题讨论】:

    标签: spring stomp sockjs


    【解决方案1】:

    FWIW,STOMP 正在 WebSocket 之上工作。当客户端和服务器进行 WebSocket 握手时,STOMP 还没有工作。所以很明显你不会得到 stomp.connect 传递的用户名。

    我不确定您如何在应用中对用户进行身份验证。但是,如果您确实有身份验证机制,则不必传递用户名,通常已经有一个经过身份验证的用户可以通过 HttpServletRequest#getUserPrincipal() 访问, 可以在 HandShakeHandler 中访问。详情可参考spring docs

    但是,如果想通过连接头发送用户名,您可以在 ChannelInterceptor 中获取它,如this answer 中所述。

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 2014-02-24
      • 2022-01-14
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2020-12-19
      • 2014-09-04
      相关资源
      最近更新 更多