Mojolicious初学(八)
一、Under——条件中间件
我们见过很多网站,打开网址时是一个登录框。无论是我们怎么样输入网址,总会跳转到登录界面,除非我们输入账户名密码登录。
under中间件为我们实现了这种功能。设置under后,我们在其后开发的url方法,被浏览器发送的网址访问时,Mojolicious会首先调用under中间件定义的方法。如果返回为真,将继续访问至url指向的方法,如果为假,将停止下面的访问。
看一个例子:
use Mojolicious::Lite -signatures;
# under方法验证name参数是否等于‘Bender’
under sub ($c) {
# 这是一个简单的模拟登录认证的方法,如果等于Bender返回1
my $name = $c->param('name') || '';
return 1 if $name eq 'Bender';
# 如果不等于,相当于未认证,将会跳转到denied.html,并返回undef,即假
$c->render(template => 'denied');
return undef;
};
# 只有认证了才能访问index.html
get '/' => 'index';
app->start;
__DATA__
@@ denied.html.ep
You are not Bender, permission denied.
@@ index.html.ep
Hi Bender.
under关键字有一个参数,作为路由的前缀:
use Mojolicious::Lite;
# /foo
under '/foo'; # under中间件定义了一个/foo前缀。这将影响到后面所有的route方法——/bar和/baz
# /foo/bar
get '/bar' => {text => 'foo bar'};
# /foo/baz
get '/baz' => {text => 'foo baz'};
# / (reset)
under '/' => {msg => 'whatever'}; # 通过under中间件重新定义为/,取消了/foo前缀。
# /bar
get '/bar' => {inline => '<%= $msg %> works'};
app->start;
under中间件可以借助group关键字进行多层嵌套,即在under下嵌套一个under:
use Mojolicious::Lite -signatures;
# 这是一个全局的under,将作用于下面所有的路由
under sub ($c) {
return 1 if $c->req->headers->header('X-Bender');
$c->render(text => "You're not Bender.");
return undef;
};
# 这里调用了group,形成了/admin节
group {
# 此处的under中间件仅仅作用在group域内
under '/admin' => sub ($c) {
return 1 if $c->req->headers->header('X-Awesome');
$c->render(text => "You're not awesome enough.");
return undef;
};
# GET /admin/dashboard
get '/dashboard' => {text => 'Nothing to see here yet.'};
};
# GET /welcome #仅受全under中间件,也就是第一个under的影响
get '/welcome' => {text => 'Hi Bender.'};
app->start;



