Perl mojoliciouswebsocket中的访问会话
在Mojolicious::Lite中,有没有办法访问websocket请求中的Perl mojoliciouswebsocket中的访问会话,perl,websocket,mojolicious,Perl,Websocket,Mojolicious,在Mojolicious::Lite中,有没有办法访问websocket请求中的会话,如下所示 get '/' => sub { my $self = shift; $self->session->{foo} = 'bar'; $self->render('index'); }; websocket '/ws' => sub { my $self = shift; $self->on(message => sub {
会话
,如下所示
get '/' => sub {
my $self = shift;
$self->session->{foo} = 'bar';
$self->render('index');
};
websocket '/ws' => sub {
my $self = shift;
$self->on(message =>
sub {
my ($self, $msg) = @_;
my $foo = $self->session->{foo}; # <<<<< is actually empty
}
);
};
get'/'=>sub{
我的$self=shift;
$self->session->{foo}='bar';
$self->render('index');
};
websocket'/ws'=>sub{
我的$self=shift;
$self->on(消息=>
潜艇{
我的($self,$msg)=@;
我的$foo=$self->session->{foo};#我最终将已签名的cookie值存储在一个隐藏的div中,然后将其与每个WS消息一起作为“协议”的一部分发送。在消息处理程序中,我检查cookie值是否存在,检查cookie值的签名,然后base64解码并像往常一样使用它,如下所示:
sub decode_cookie {
my ($self, $cookie_val) = @_;
my $json = Mojo::JSON->new();
my $secret = $self->stash->{'mojo.secret'};
if ($cookie_val =~ s/--([^\-]+)$//) {
my $sig = $1;
#app->log->debug("cookie=".$cookie_val);
#app->log->debug("sig=".$sig);
my $check = Mojo::Util::hmac_sha1_sum $cookie_val, $secret;
unless(Mojo::Util::secure_compare $sig, $check) {
app->log->warn("invalid session cookie signature");
return;
}
} else {
app->log->warn("failed to extract cookie value");
return;
}
my $session = $json->decode(Mojo::Util::b64_decode($cookie_val));
unless($session) {
app->log->warn("failed to b64-decode session cookie");
return;
}
return $session;
}
websocket '/rtc' => sub {
my $self = shift;
my $json = Mojo::JSON->new;
$self->on(message =>
sub {
my ($self, $data) = @_;
app->log->debug("received WS message: ".$data);
$data = $json->decode($data);
my $session = decode_cookie($self, $data->{cval});
# do whatever you have to here...
}
);
我也遇到过这个问题。我不确定这是否可能。可能是在上提交了一个bug?在发布到这里之前,我已经在他们的邮件列表上询问过了,但从未得到回复。我最终将签名的cookie值存储在一个隐藏的div中,然后将其作为“协议”的一部分与每个WS-message一起发送。在消息处理程序中,我检查cookie值是否存在,检查它的签名,然后base64解码并像往常一样使用它。