【问题标题】:Can I make a single Perl module act as multiple kinds of mod_perl handlers?我可以让单个 Perl 模块充当多种 mod_perl 处理程序吗?
【发布时间】:2009-02-12 06:33:00
【问题描述】:

我正在为 Apache 中的各种登录相关功能编写一系列相关的 mod_perl 处理程序,所以我的 Apache 配置文件看起来像这样(例如)

PerlAccessHandler MyApache::MyAccess    
PerlAuthenHandler MyApache::MyAuthen
PerlAuthzHandler MyApache::MyAuthz

每个模块(MyAccessMyAuthenMyAuthz)都定义了一个

sub handler() {}

mod_perl 在请求处理的相关点调用。

我想知道的是,是否有一种方法可以用一个 Perl 模块而不是三个来做到这一点(安装一个模块而不是三个模块更简洁,用户工作量也更少)?

也许有什么方法可以定义处理程序方法的名称。或者有没有办法从handler() 代码中检测我应该进行哪种处理?

【问题讨论】:

    标签: perl apache mod-perl


    【解决方案1】:

    mod_perl 2.0 docs 看来,您可以使用“方法”语法来做您想做的事(我还没有测试过):

    PerlAccessHandler MyApache::MyLoginModule->access_handler
    PerlAuthenHandler  MyApache::MyLoginModule->authen_handler
    PerlAuthzHandler MyApache::MyLoginModule->authz_handler
    

    我相信这会导致 mod_perl 在您的 MyApache::MyLoginModule 类上以静态方式调用每个命名方法。

    如果你愿意,你也可以创建一个在调用handler方法时使用的对象:

    <Perl>
      use MyApache::MyLoginModule;
      $MyApache::MyLoginModule::access = MyApache::MyLoginModule->new(phase => 'access');
      $MyApache::MyLoginModule::authen = MyApache::MyLoginModule->new(phase => 'authen');
      $MyApache::MyLoginModule::authz = MyApache::MyLoginModule->new(phase => 'authz');
    </Perl>
    
    PerlAccessHandler $MyApache::MyLoginModule::access->handler
    PerlAuthenHandler $MyApache::MyLoginModule::authen->handler
    PerlAuthzHandler $MyApache::MyLoginModule::authz->handler
    

    这种方法允许您拥有一个 handler 方法,该方法可以根据创建对象时设置的对象属性具有不同的行为。

    免责声明:我已经有一段时间没有使用 mod_perl 配置的这一部分了,所以您的结果可能会有所不同!

    【讨论】:

    • 使用“...>access_handler”语法有效。有趣的是,处理程序传递了两个参数(第二个是请求对象),不像 handler() 函数,它只传递请求。
    • 两个参数的行为记录在我的答案顶部的链接中。
    【解决方案2】:

    看起来一种可能性是使用push_handlers() 调用并在代码中而不是在 apache conf 文件中设置处理程序

    请看这里:http://tinyurl.com/bwdeew

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 2022-12-13
      • 2013-08-01
      • 2010-10-22
      • 1970-01-01
      • 2018-08-09
      • 2013-08-03
      相关资源
      最近更新 更多