2013-03-25 22 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

相關問題