提问人:Lvkas_ 提问时间:10/28/2023 更新时间:10/28/2023 访问量:29
Javalin websockets 标头
Javalin websockets headers
问:
我正在尝试使用 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 的标头方法。但是如何设置标题呢?
我等不及第一条消息了,因为我的访问管理器阻止了连接。
多谢。
答:
0赞
kaqqao
10/28/2023
#1
这将是一个冷水澡,但浏览器无法在 WebSocket 握手期间发送 HTTP 标头,尽管它是一个常规的 HTTP 请求,除了一些超出您控制范围的特殊标头,以及 WebSocket 子协议标头,这是您唯一可以控制的标头。因此,问题不在于您的 Java 代码。Sec-WebSocket-Protocol
您可以尝试各种解决方法,包括将令牌作为子协议走私,因为可以有多个值。在这里查看我的(非常全面的)答案:https://stackoverflow.com/a/77060459/294657Sec-WebSocket-Protocol
评论