gpt4 book ai didi

session - 如何从Dart HttpServer WebSocket访问HttpSession数据?

转载 作者:行者123 更新时间:2023-12-03 02:58:58 25 4
gpt4 key购买 nike

我有一个非常简单的WebSocket服务器:

class WsServer {
WsServer();

void runServer(int port) {
ConnectionsHandler connectionsHandler = new ConnectionsHandler();

HttpServer
.bind('127.0.0.1', port)
.then((HttpServer server) {
print('listening for connections on $port');

var sc = new StreamController();
sc.stream.transform(new WebSocketTransformer()).listen(connectionsHandler.onConnection);

server.listen((HttpRequest request) {
if (request.uri.path == '/ws') {
sc.add(request);
}
// we dont deal static files
});
},
onError: (error) => print("Error starting HTTP server: $error"));
}
}

class ConnectionsHandler {
List<WebSocket> connections = new List<WebSocket>();

ConnectionsHandler();

void onConnection(WebSocket conn) {
print('new ws conn');
connections.add(conn);
conn.listen(
onMessage,
onDone: () => connections.remove(conn),
onError: (e) => connections.remove(conn)
);
}

void onMessage(message) {
print('new ws msg: $message');
}
}

我需要在 request.session中获取 ConnectionsHandlerWebSocketTransformer似乎仅发送 WebSocket连接,而该 session 无法访问原始 HttpRequest

有没有办法从websocket处理程序本身访问 session 数据?即使客户端从cookie发送dart session ID,那么如何检索和刷新HttpSession呢?

最佳答案

如果Web套接字连接使用与普通HTTP请求相同的来源,则您也许可以使它起作用,但是您只能看到Cookie,从而可以看到 session 。

请注意,无需在流中使用WebSocketTransformer。您可以一次升级一个请求。

您可以尝试以下代码吗?

import 'dart:io';
import 'dart:async';

class WsServer {
WsServer();

void runServer(int port) {
ConnectionsHandler connectionsHandler = new ConnectionsHandler();

HttpServer
.bind('127.0.0.1', port)
.then((HttpServer server) {
print('listening for connections on $port');
var connHandler = new ConnectionsHandler();
var webSocketTransformer = new WebSocketTransformer();

server.listen((HttpRequest request) {
if (request.uri.path == '/ws') {
webSocketTransformer.upgrade(request)
.then((WebSocket ws) {
connHandler.onConnection(ws, request);
});
// TODO handle error from update
}
// we dont deal static files
});
},
onError: (error) => print("Error starting HTTP server: $error"));
}
}

class ConnectionsHandler {
List<WebSocket> connections = new List<WebSocket>();

ConnectionsHandler();

void onConnection(WebSocket conn, HttpRequest req) {
print('new ws conn');
connections.add(conn);
conn.listen(
(message) {
print('new ws msg: $message and ${req.session.keys}');
},
onDone: () => connections.remove(conn),
onError: (e) => connections.remove(conn)
);
}
}

main() {
var server = new WsServer();
server.runServer(3000);
}

关于session - 如何从Dart HttpServer WebSocket访问HttpSession数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16042953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com