【问题标题】:How can a custom filter be added to the HttpPipeline using afBedSheet?如何使用 afBedSheet 将自定义过滤器添加到 HttpPipeline?
【发布时间】:2013-11-04 19:51:14
【问题描述】:

afBedSheet documentation 表示“过滤器可用于解决跨领域问题,例如授权。”并显示此代码 sn-p:

@Contribute { serviceType=HttpPipeline# }
static Void contributeHttpPipeline(OrderedConfig conf, AuthFilter myAuthFilter) {
  conf.addOrdered("AuthFilter", myAuthFilter, ["after: BedSheetFilters"])
}

我正在尝试实现一个 AuthFilter(现在是一个假人,但要演变成一个真正的 AuthFilter),但我无法让它工作:

using afBedSheet

const mixin AuthFilter : HttpPipelineFilter { }

internal const class AuthFilterImpl : AuthFilter {

    internal new make(|This|in) { in(this) }

    override Bool service(HttpPipeline handler) {
        echo("Dummy AuthFilter invoked!")
        return handler.service
    }
}

我可以成功构建项目,但是当我运行它并调用任何 HTTP 服务时,我收到以下错误。我相信我必须将我的 AuthFilter 声明或注释为afIoc 服务,但不知道在哪里或如何。谁能告诉我怎么做?

线程局部变量: ThreadStash.01.BedSheetModule.0017.perThreadState:fan.afIoc.ModuleServices@1ab5e0b ThreadStash.01.HttpRequest.0001.headers:fan.afBedSheet.HttpRequestHeaders@1ab6087 afIoc::ThreadStash.counter: 13 web.req: fan.wisp.WispReq@4e62cc web.res: fan.wisp.WispRes@387bc2 网络会话:060f9951-41f1-e500-0fc2-0019b971d079 [05:27:18 05-Nov-13] [err] [web] 内部错误处理:/info afIoc::IocErr:没有依赖匹配类型 mt::AuthFilter。 Ioc 操作跟踪: [1] 通过类型 'afBedSheet::HttpPipeline' 定位依赖 [2] 创建真正的服务 'HttpPipeline' [3] 通过构建器方法“afBedSheet::BedSheetModule.buildHttpPipeline”创建服务“HttpPipeline” [ 4] 确定 afBedSheet::HttpPipeline buildHttpPipeline(afBedSheet::HttpPipelineFilter[] filters, afIoc::PipelineBuilder bob, afIoc::Registry reg) 的注入参数 [ 5] 寻找 afBedSheet::HttpPipelineFilter[] 类型的依赖项 [6] 收集 afBedSheet::HttpPipelineFilter[] 类型的 ORDERED 配置 [ 7] 确定 sys::Void 的注入参数 我的身份验证过滤器) [ 8] 寻找 mt::AuthFilter 类型的依赖 堆栈跟踪: afIoc::Utils.stackTraceFilter (Utils.fan:63) afIoc::RegistryImpl.dependencyByType (RegistryImpl.fan:243) afBedSheet::BedSheetWebMod.onService (BedSheetWebMod.fan:34) wisp::WispActor.doService (WispActor.fan:197) wisp::WispActor.process (WispActor.fan:78) wisp::WispActor.receive (WispActor.fan:48) 并发::Actor._dispatch (Actor.java:228) 并发::Actor._work (Actor.java:199) 并发::ThreadPool$Worker.run (ThreadPool.java:255)

【问题讨论】:

    标签: fantom afbedsheet


    【解决方案1】:

    AuthFilter 不需要 声明为服务 - 您可以在contribute() 方法中新建一个实例:

    @Contribute { serviceType=HttpPipeline# }
    static Void contributeHttpPipeline(OrderedConfig conf) {
    
        authFilter := AuthFilterImpl()
    
        conf.addOrdered("AuthFilter", authFilter, ["after: BedSheetFilters"])
    }
    

    如果AuthFilter 依赖于其他服务(例如,它具有使用@Inject 注释的字段),那么afIoc 应该为您构建实例。 OrderedConfigMappedConfig 对象有一个方便的 autobuild() 方法来解决这个问题:

        authFilter := conf.autobuild(AuthFilterImpl#)
    

    如果你想将AuthFilter 注入到其他服务中,或者你想为它做贡献,那么它需要定义为afIoc 服务。使用AppModule 中的bind() 方法来执行此操作:

    static Void bind(ServiceBinder binder) {
        binder.bind(AuthFilter#, AuthFilterImpl#)
    }
    

    它可能是参数注入到contribute方法中,就像你在你的例子中一样:

    @Contribute { serviceType=HttpPipeline# }
    static Void contributeHttpPipeline(OrderedConfig conf, AuthFilter authFilter) {
    
        conf.addOrdered("AuthFilter", authFilter, ["after: BedSheetFilters"])
    }
    

    有关详细信息,请参阅afIoc - definingServicesBedSheetModule 也可能是 afIoc 示例的一个很好的参考。

    【讨论】:

      猜你喜欢
      • 2016-06-25
      • 1970-01-01
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 2018-06-22
      • 1970-01-01
      相关资源
      最近更新 更多