Javalin websockets 标头

Javalin websockets headers

提问人:Lvkas_ 提问时间:10/28/2023 更新时间:10/28/2023 访问量:29

问:

我正在尝试使用 js 中的 websocket 连接到我的 Javalin-Backend。 这是我在 Javalin 中的 Access-Manager:

@Override
  public void manage(@NotNull Handler handler, @NotNull Context context, @NotNull Set<? extends RouteRole> set) throws Exception {
    if (set.isEmpty()) {
      handler.handle(context);
      return;
    }

    String token = context.header("token");
    if (token == null) {
      context.status(HttpStatus.UNAUTHORIZED);
      return;
    }

    Integer userId = this.tokenService.getUserIdByToken(token).orElse(null);
    if (userId == null) {
      context.status(HttpStatus.UNAUTHORIZED);
      return;
    }

    Account account = this.accountService.getAccount(userId).orElse(null);
    if (account == null || account.isDisabled()) {
      context.status(HttpStatus.FORBIDDEN);
      return;
    }

    if (set.contains(AuthenticationLevel.ADMIN) && !account.isAdministrator()) {
      context.status(HttpStatus.FORBIDDEN);
      return;
    }

    context.attribute(Constants.ACCOUNT_ATTRIBUTE_KEY, account);
    handler.handle(context);
  }

现在,默认情况下,每个 websocket-connection 也会从 javalin 传递 acces 管理器。但是我的 websocket 连接由于缺少标头(“token”)而失败。

这是我的websocket-connection代码:

    const socket = new WebSocket("wss://luxcars-api.lukas.bayern/chat", "your-subprotocol", {
        headers: {
            'token': getCookie('token')
        }
    });

有谁知道,如何在连接时直接设置标头? 在 Javalin 文档 (https://javalin.io/documentation#wscontext) 中,还有 WebSocketContext 的标头方法。但是如何设置标题呢?

我等不及第一条消息了,因为我的访问管理器阻止了连接。

多谢。

java html java-websocket javalin

评论


答:

0赞 kaqqao 10/28/2023 #1

这将是一个冷水澡,但浏览器无法在 WebSocket 握手期间发送 HTTP 标头,尽管它是一个常规的 HTTP 请求,除了一些超出您控制范围的特殊标头,以及 WebSocket 子协议标头,这是您唯一可以控制的标头。因此,问题不在于您的 Java 代码。Sec-WebSocket-Protocol

您可以尝试各种解决方法,包括将令牌作为子协议走私,因为可以有多个值。在这里查看我的(非常全面的)答案:https://stackoverflow.com/a/77060459/294657Sec-WebSocket-Protocol