当前位置: 首页 > 知识库问答 >
问题:

WebSocket Stomp over SockJS-超文本传输协议自定义标头

贡光明
2023-03-14

我用的是跺脚。我的javascript客户端中的js over SockJS。我正在使用连接到websocket

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

stomp over sockJS连接有2个http请求:

  1. 请求发送至/info
  2. http升级请求

客户端发送所有cookie。我也想发送自定义头(例如XSRF头),但没有找到方法。谢谢你的帮助。

共有3个答案

劳英华
2023-03-14

如果在服务器上使用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变量和必需的gettersettersconstructor

在前端使用跺脚

用法-

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

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

胡桐
2023-03-14

自定义标题:

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

没有自定义标题:

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

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

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

在服务器端,如果您使用的是Spring框架,那么您可以实现一个拦截器来将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}));
}
水渊
2023-03-14

@rohitdev所以基本上你不能发送任何HTTP标头使用StompClient,因为STOMP是层在webSocket,只有当webSocket握手发生时,我们有可能发送自定义标头。所以只有SockJS可以发送这个标题,但是出于某些原因不要这样做:https://github.com/sockjs/sockjs-client/issues/196

 类似资料:
  • 我正在开发小型Spring mvc应用程序,其中用户需要重定向到带有一些超文本传输协议标头的外部应用程序。例如,用户在url上的应用程序1上http://localhost:8080/app1.在这个应用程序中,我们有一些表单的简单jsp页面,用户填写它。之后,我们需要在表单提交时收集这些数据,并将用户重定向到url上的另一个外部应用程序,如http://localhost:9090/app2 现

  • 我正在使用GWT和Spring controller来管理http流量。有些请求可能需要很长时间,但我希望在超过给定时间时终止请求。 我如何配置超时Spring。我也使用Apache Tomcat 7.0。我试图在tomcat上inrease最大线程,但有一段时间tomcat工作缓慢,因为请求线程不会死。

  • 我只是有一个关于服务中http请求的结构和处理响应的问题。我正在使用Angular2。alpha46 Typescript(刚刚开始测试-我喜欢它…Ps…。感谢所有一直致力于它并通过github作出贡献的人) 因此,采取以下措施: 登录表单。组成部分ts 从这个组件中,我导入了我的userService,它将容纳我的超文本传输协议请求,以登录用户。 使用者服务ts 我想做的是能够处理http请求之

  • 我的LogCat: 签名密钥(sw)为https://api.dropbox.com/1/shares/dropbox/a.jpg?oauth_consumer_key=2f2y1dyuqhp58ek 我对http没有太多经验。。 因为httpPost=新的httpPost(sw);工作正常,这是否意味着基本字符串签名正确? 还是我错过了什么?

  • 我试图禁用我的AngularJS应用程序中的缓存,但它无法使用以下代码: 当我使用

  • 我需要检查与vbscript的http连接 我想打给主机看看主机是否有反应 我需要测试到特定端口的连接,为什么不使用url呢 你有解决办法吗?