1

我正在使用 Mojolicious Lite 构建一个应用程序,并且我正在寻找一种方法来查看有关活动会话的所有数据。我这样做主要是因为这是我第一次尝试使用 Mojolicious Lite 会话,我想看看幕后发生了什么。

几点注意事项:我对 Mojolicious 还是很陌生,正如您可能猜到的那样,我使用的是 Mojolicious Lite。我之前编写的任何 Mojolicious Lite 应用程序都非常琐碎,所以我对它的熟悉程度并不深。就此而言,我仍然是 perl 的“早期中级,充其量”,因此在 perl 中探索任何 OO 的内部工作原理对我来说在很大程度上是陌生的领域。

也就是说,我给自己做了几条这样的小路线:

get '/firstpage' => sub{
    my $self = shift;
    my $usr = $self->session(user => 'first_user');
    $self->render(text => $usr);
};

get '/secondpage' => sub{
    my $self = shift;
    my $usr = $self->session(user => 'second_user');
    $self->render(text => $usr);
};

get '/sessions' => sub{
    my $self = shift;
    $self->render(text => Dumper(app->sessions));
};

我正在假设,在我访问前两个 url 之后,Mojolicious 将在某处拥有“一些”数据,以确认它知道 first_user 和 second_user。(我对如何使用 Mojolicious Lite 会话的理解也可能完全偏离基础......老实说,从文档中,我不太确定。)

可悲的是, /sessions 只是向我展示了 Mojolicious::Sessions 对象的内容:

$VAR1 = bless( { 'cookie_path' => '/', 'secure' => 0, 'cookie_name' => 'mojolicious', 'default_expiration' => 3600 }, 'Mojolicious::Sessions' );

但我假设,在某个地方,我可以得到 Mojolicious 拥有的所有与会话相关的数据的哈希值。我一直在寻找文档一段时间,但我还没有找到任何线索。

有什么见解吗?

4

1 回答 1

6

我正在假设,在我访问前两个 url 之后,Mojolicious 将在某处拥有“一些”数据,以确认它知道 first_user 和 second_user。(我也可能完全不了解如何使用 Mojolicious Lite 会话......老实说,从文档中,我不太确定。)

是的,我认为你错过了会议的重点。服务器/应用程序不会记住每个访问用户的状态。为了让它看起来好像确实如此,我们有 cookie。会话是每个客户端的持久性事物。

会话信息只是一个哈希引用,编码为 JSON 并存储在客户端的 cookie 中。这对于记住您已登录很有用,例如用户名,可能是购物车中事物的数组引用。当您请求页面时,此 cookie 会被发送回服务器,服务器可以访问数据并准备响应,以便您了解会话的状态。

因此,没有“活动会话”的记录。所有这些信息都分布在所有客户之间。

如果您想更好地了解正在发生的事情,我可以推荐 tempire 的插件Mojolicious::Plugin::ConsoleLogger,它对于当前请求在浏览器的 javascript 控制台中显示所有相关信息(会话、存储等)。

这是一个例子。

#!/usr/bin/env perl

use Mojolicious::Lite;

#plugin 'ConsoleLogger'; # if desired

any '/' => sub {
  my $self = shift;
  my $name = $self->session('name') || 'Unknown'; # get the name from the session
  $self->render( text => "Hello $name" );
};

any '/name/:name' => sub {
  my $self = shift;
  my $name = $self->stash('name'); # get name from path
  $self->session( name => $name ); # and store it in the session
  $self->redirect_to('/');
};

any '/logout' => sub {
  my $self = shift;
  $self->session( expires => 1 );
  $self->redirect_to('/');
}; 

app->start;

如果您访问/name/ghorahn它,它会将您的姓名存储在 cookie 中。从那时起,每次您访问/它都会向您打招呼,直到:

  1. 您的会话到期(默认为您上次访问后的 1 小时)
  2. 您通过以下方式更改姓名/name/whatever
  3. 您访问/logout手动使会话过期

您会注意到另一个用户(在另一台计算机上,甚至在同一台计算机上的不同浏览器上)可能有不同的名称,但两者都是持久的。这就是会话的用途。:-)

于 2013-03-25T12:36:09.073 回答