簡體   English   中英

WebSocket Stomp over SockJS - http 自定義標頭

[英]WebSocket Stomp over SockJS - http custom headers

我在我的 javascript 客戶端中通過 SockJS 使用 stomp.js。 我正在使用

stompClient.connect({}, function (frame) {

stomp over sockJS 連接有 2 個 http 請求:

  1. 請求/信息
  2. http升級請求

客戶端發送所有 cookie。 我還想發送自定義標頭(例如 XSRF 標頭),但沒有找到方法。 將不勝感激任何幫助。

@Rohitdev 所以基本上你不能使用 stompClient 發送任何HTTP標頭,因為 STOMP 是 websockets 的層,只有當 websockets 握手發生時,我們才有可能發送自定義標頭。 所以只有 SockJS 可以發送這個標頭,但由於某些原因不要這樣做: https : //github.com/sockjs/sockjs-client/issues/196

自定義標題:

stompClient.connect({token: "ABC123"}, function(frame) { ... code ...});

沒有自定義標題:

stompClient.connect({}, function(frame) { ... code ...});

在 Javascript 中,您可以使用以下方法提取 STOMP 標頭:

  username = frame.headers['user-name'];

在服務器端,如果您使用的是 Spring Framework,您可以實現一個攔截器來將 HTTP 參數復制到 WebSockets STOMP 標頭。

public class HttpSessionHandshakeInterceptor_personalised implements HandshakeInterceptor {

    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response,
            WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {


        // Set ip attribute to WebSocket session
        attributes.put("ip", request.getRemoteAddress());

        // ============================================= CODIGO PERSONAL
        ServletServerHttpRequest servletRequest = (ServletServerHttpRequest) request;
        HttpServletRequest httpServletRequest = servletRequest.getServletRequest();
//        httpServletRequest.getCookies();
//        httpServletRequest.getParameter("inquiryId");
//        httpServletRequest.getRemoteUser();

         String token = httpServletRequest.getParameter("token");


      ...
    }
}

對於沒有 STOMP 參數的發送消息:

function sendMessage() {
     var from = document.getElementById('from').value;
     var text = document.getElementById('text').value;
            stompClient.send("/app/chatchannel", {},
               JSON.stringify({'from':from, 'text':text}));
}

在這里,您將參數傳遞到 STOMP 標頭中。

function sendMessage() {
     var from = document.getElementById('from').value;
     var text = document.getElementById('text').value;
            stompClient.send("/app/chatchannel", {'token':'AA123'},
               JSON.stringify({'from':from, 'text':text}));
}

如果您在服務器上使用 Spring boot,請在方法中使用@Header(name = "token")注釋。

用法 -

@Controller
public class SocketController {

    static final String token = "1234";

    @MessageMapping("/send")
    @SendTo("/receive/changes")
    public Object notify(MessageModel message, @Header(name = "token") String header)throws Exception {
        if(!header.equals(token)) {
            // return when headers do not match
            return("Unauthorized");
        }
        // return the model object with associated sent message
        return new MessageModel(message.getMessage());
    } 
}

您應該有一個MessageModel類,其中包含message變量和必需的getterssetterscontructor

在前端使用 Stomp

用法 -

function sendMessage() {
     var text = document.getElementById('text').value;
            stompClient.send("/send/message", {'token':'1234'},
               JSON.stringify({'message':text}));
}

為了增加更多的安全性,你可以在 Spring 中使用 CORS

來自http://jmesnil.net/stomp-websocket/doc/

stompClient.connect(headers,connectCallback,errorCallback);

其中header是包含自定義HTTP標頭的地圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM