2013-03-25 47 views
1

我正在用Mojolicious Lite构建一个应用程序,我正在寻找一种方法来查看有关活动会话的任何和所有数据。我主要是这样做的,因为这是我第一次尝试使用Mojolicious Lite进行会话,并且我希望看到底下发生了什么。如何在Mojolicious Lite应用程序中查看所有活动会话?

一对夫妇笔记: 我是Mojolicious的新手,你可能会猜到我使用的是Mojolicious Lite。我之前写过的任何Mojolicious Lite应用程序都非常简单,所以我对它的熟悉程度并不深刻。 对于这个问题,我仍然是perl的'早期中间',所以围绕perl的任何东西的内部运作都是我在外国的领域。

这么说,我自己做了一些小的路线,像这样:

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)); 
}; 

我工作过的是,在我访问的第一个两个网址,Mojolicious将有“一些”数据某处假设会确认它知道first_user和second_user。 (我也可能完全脱离了理解如何使用Mojolicious Lite会话的基础......诚实地说,从文档来看,我不太确定。)

不幸的是,/会议只是显示我的内容Mojolicious ::会话对象:

$ VAR1 =保佑({ 'cookie_path'=> '/', '安全的'=> 0, 'cookie_name'=> 'mojolicious', 'default_expiration' => 3600 },'Mojolicious :: Sessions');

但我假设,在某个地方,我可以得到Mojolicious所有会话相关数据的散列。我一直在围绕文档一段时间,但我还没有找到任何线索。

任何见解?

回答

5

我的假设是,在我访问前两个网址之后,Mojolicious将会在某处确定它所知道的first_user和second_user。 (我也可以完全脱离基础,我理解如何使用Mojolicious Lite会话......说实话,从文档来说,我不太确定。)

是的,我想你错过了会话点。服务器/应用程序不记得每个访问用户的状态。为了让它看起来像它,我们有饼干。会话是每个客户端的持久性事物。

会话信息只是一个哈希引用,编码为JSON并存储在客户端的cookie中。这对于记住您已登录,作为用户名,可能是购物车中物品的arrayref有用。当你请求一个页面时,这个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手动过期会话

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

+0

是的,我一直不清楚会话在后端持久化中扮演的角色。我在想,Mojolicious会跟踪它的一些内容......但这听起来像Mojolicious只是处理了“你是谁?以便我可以使用该身份查找我写入应用程序的任何持久数据。我会研究一下ConsoleLogger ......这听起来像是我想看到的那种东西。谢谢! – 2013-03-25 19:03:20

+2

您可以将4k数据写入cookie中,因此您可以在会话中存储相当多的数据。此外,自签名以来,您甚至可以存储诸如“登录用户名”之类的内容,并且由于客户端不能更改它,因此可以放心地信任它。请享用。 – 2013-03-25 21:04:06