IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

根据条件来加载中间件

扶凯 2011-08-19 23:09:48 累计浏览 2,452 次
本机暂存

我们介绍了数个中间件组件,这些中的一部分是非常有效的所以我们要激活他为全局的。但其它的一些最好只是当我们确认的时候才激活,今天我们就要讲这个的解决方案。

根据条件来加载中间件
条件在中间件中是超级中间件,这些中间件需要和一些运行的条件一起,才会被启用。让我们看看一些例子:

  • 你只想在 /public 中想激活 JSONP 中间件
  • 你不想在你本地的 ip 中激活 Basic Auth

我认真的研究了 WSGI 和 Rack ,但没发现很好的这种解决方案,他们大多只是单个组件有这个功能。我没有见到很 cool 的功能。

Middleware::Conditional
这是一个 Conditional 中间件是最终的灵活的解决方法:

use Plack::Builder;
 
builder {
    enable_if { $_[0]->{REMOTE_ADDR} !~ /^192\.168\.0\./ }
        "Auth::Basic", authenticator => ...;
    $app;
};

这添加了一个新的 enable_if 的关键字到 Plack::Builder ,这需要一个获取运行时请求中的信息做为评估,如果这个块的返回是真 ($_[0] 是 $env 的环境变量中的hash)。
这个例子的代码检查这个来自本地的请求和认证过的请求。
Conditiona 是作为一个众多中间件之一,这相当于:

use Plack::Middleware::Conditional;
use Plack::Middleware::Auth::Basic;
 
my $app = sub { ... };
 
$app = Plack::Middleware::Conditional->wrap($app,
    builder => sub {
        Plack::Middleware::Auth::Basic->wrap(
            $_[0], authenticator => ...,
        );
    },
    condition => sub {
        my $env = shift;
        $env->{REMOTE_ADDR} !~ /^192\.168\.0\./;
    },
);

但这只是一个无聊的的写法,所以建议使用 DSL 的版本,这是我所推荐你使用的 :)

这是我的译文,原文:http://advent.plackperl.org/2009/12/day-18-load-middleware-conditionally.html

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 检查nginx配置,重载配置以及重启的方法 (累计阅读 10,895)
  2. Push Or Pull? (累计阅读 5,262)
  3. 自动化运维之企业实际案例分析 (累计阅读 4,722)
  4. 解决 ubuntu 的 /etc/hosts 重启就被还原 (累计阅读 4,439)
  5. 2012年数据库技术大会 百度和淘宝介绍的中间件对比 (累计阅读 3,999)
  6. 级联多个应用 (累计阅读 3,606)
  7. 服务器间同步/镜像/备份配置备忘录 (累计阅读 3,173)
  8. 关于热键和键盘布局 (累计阅读 3,027)
  9. puppet 手册检查puppet配置文件和使用puppet tags (累计阅读 2,615)
  10. 通过中间件来实现应用的认证 (累计阅读 2,599)