kong.ctx

本文原文链接:https://docs.konghq.com/1.1.x/pdk/kong.ctx/

当前请求上下文数据

kong.ctx.shared

一个具有当前请求生命周期并在所有插件之间共享的表。它可用于在给定请求中的多个插件之间共享数据。

由于仅在请求的上下文中相关,因此无法从Lua模块的顶级块访问此表。 相反,它只能在请求阶段中访问,这些阶段由插件接口的rewriteaccessheader_filterbody_filterlog阶段表示。在这些函数(及其被调用者)中访问此表是可以的。

所有其他插件都可以看到插件在此表中插入的值。在与其值进行交互时必须谨慎,因为命名冲突可能导致数据覆盖。

  • 阶段
    • rewrite, access, header_filter, body_filter, log
  • 用法

    1. -- 两个插件 A and B, 如果插件 A B有更高的优先级
    2. -- (在 B之前执行):
    3. -- plugin A handler.lua
    4. function plugin_a_handler:access(conf)
    5. kong.ctx.shared.foo = "hello world"
    6. kong.ctx.shared.tab = {
    7. bar = "baz"
    8. }
    9. end
    10. -- plugin B handler.lua
    11. function plugin_b_handler:access(conf)
    12. kong.log(kong.ctx.shared.foo) -- "hello world"
    13. kong.log(kong.ctx.shared.tab.bar) -- "baz"
    14. end

kong.ctx.plugin

具有当前请求生命周期的表 - 与kong.ctx.shared不同,此表不在插件之间共享。相反,它仅对当前插件实例可见。也就是说,如果配置了速率限制插件的多个实例(例如,在不同的Services上),则每个实例都有自己的表,用于每个请求。

由于它的命名空间性质,这个表比kong.ctx.shared更安全,因为它避免了潜在的命名冲突,这可能导致几个插件在不知不觉中覆盖彼此的数据。

由于仅在请求的上下文中相关,因此无法从Lua模块的顶级块访问此表。相反,它只能在请求阶段中访问,这些阶段由插件接口的rewriteaccessheader_filterbody_filterlog阶段表示。在这些函数(及其被调用者)中访问此表是可以的。

插件在此表中插入的值仅在此插件实例的成功阶段中可见。例如,如果插件想要在日志阶段保存一些值以进行后处理:

  • 阶段
    • rewrite, access, header_filter, body_filter, log
  • 用法

    1. -- plugin handler.lua
    2. function plugin_handler:access(conf)
    3. kong.ctx.plugin.val_1 = "hello"
    4. kong.ctx.plugin.val_2 = "world"
    5. end
    6. function plugin_handler:log(conf)
    7. local value = kong.ctx.plugin.val_1 .. " " .. kong.ctx.plugin.val_2
    8. kong.log(value) -- "hello world"
    9. end