`
can_do
  • 浏览: 262514 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Kong自定义插件【request-keyword-param-check】

阅读更多
1、插件作用

校验请求参数间的关系,支持以下操作类型:
(1)mandatory,表示请求uri中是必须携带的参数
(2)contain,表示两个参数之间是否有包含关系,前者是否包含后者
(3)exist,表示所配置参数必须同时有值
(4)begin,表示请求参数值是否以某个指定值开头
(5)end,表示请求参数值是否以某个指定值结尾
(6)firm,表示请求参数是否为指定的值

2、核心代码

local function decideUriExists(uri_key,uri_value,uri_param_tab,uri_relation_tab)
  local exists = true

  local args = ngx.req.get_uri_args()
  local http_uri_key_value = args[uri_key]
  if (http_uri_key_value ~= nil)  and  (string.lower(uri_value) == string.lower(http_uri_key_value)) then
    -- Nothing to do
  else
     return exists
  end 
  
  for i = 1, #uri_param_tab do
    local local_uri_param = uri_param_tab[i]
    local local_uri_relation = uri_relation_tab[i]
    local sub_uri_param_tab = setmetatable(pl_stringx.split(local_uri_param, ";"), nil)
    -- according to this parameter to decide if condition true or false
    local skip_flag = false 
    -- process different logic operation according to relation
    -- relation=mandatory
    if ('mandatory' == local_uri_relation) then
      skip_flag = true
      for j = 1, #sub_uri_param_tab do
        local local_uri_key=sub_uri_param_tab[j]
        local http_uri_arg_value = args[local_uri_key]
        if (http_uri_arg_value == nil or http_uri_arg_value == "") then
          exists = false
          break
        end
      end
    end
    -- whether to skip the outer circle logic
    if (not exists) then
    break
    end
    -- relation=contain,only compare two uri key 
    if (not skip_flag and 'contain' == local_uri_relation) then
      skip_flag = true
      local parent_key_value = args[sub_uri_param_tab[1]]
      local child_key_value = args[sub_uri_param_tab[2]]
      local idx_end = nil
      if (parent_key_value == nil or parent_key_value == "" or child_key_value == nil or child_key_value == "") then
         exists = false
         break
      else
        _,idx_end = string.find(string.lower(parent_key_value),string.lower(child_key_value))
      end
      if (idx_end ~= nil  and idx_end >= 1) then
        -- Nothing to do
      else
        exists = false
        break
      end
    end
   -- relationship=exist,only compare two uri key
    if (not skip_flag and 'exist' == local_uri_relation) then
      skip_flag = true
      local parent_key_value = args[sub_uri_param_tab[1]]
      local child_key_value = args[sub_uri_param_tab[2]]
      if ((parent_key_value ~= nil and parent_key_value ~= "" and child_key_value ~= nil and child_key_value == "") or (parent_key_value ~= nil and parent_key_value == "" and child_key_value ~= nil and child_key_value ~="")) then
        exists = false
        break
      end
    end
   -- relationship=begin,only compare two uri key
   if (not skip_flag and 'begin' == local_uri_relation) then
      skip_flag = true
      local parent_key_value = args[sub_uri_param_tab[1]]
      local child_value = sub_uri_param_tab[2]
      local idx_begin = nil
      if (parent_key_value == nil or parent_key_value == "") then
         exists = false
         break
      else
        idx_begin,_ = string.find(string.lower(parent_key_value),string.lower(child_value))
      end
      if (idx_begin ~= nil  and idx_begin == 1) then
      else
        exists = false
        break
      end
   end
   -- relationship=end,only compare two uri key
   if (not skip_flag and 'end' == local_uri_relation) then
      skip_flag = true
      local parent_key_value = args[sub_uri_param_tab[1]]
      local child_value = sub_uri_param_tab[2]
      local idx_end = nil
      if (parent_key_value == nil or parent_key_value == "") then
         exists = false
         break
      else
        _,idx_end = string.find(string.lower(parent_key_value),string.lower(child_value))
      end
      if (idx_end ~= nil  and idx_end == string.len(parent_key_value)) then
      else
        exists = false
        break
      end
   end
   -- relationship=firm,only compare two uri key
   if (not skip_flag and 'firm' == local_uri_relation) then
      skip_flag = true
      local counter = 0
      for j = 1, #sub_uri_param_tab do
        local sub_key_and_value_tab = setmetatable(pl_stringx.split(sub_uri_param_tab[j], "="), nil)
        local http_uri_arg_value = args[sub_key_and_value_tab[1]]
        if (http_uri_arg_value ~= nil and http_uri_arg_value ~= "" and sub_key_and_value_tab[2] ~= nil and sub_key_and_value_tab[2] ~= "" and sub_key_and_value_tab[2] == http_uri_arg_value) then
        counter = counter + 1
        end
      end
     if (counter == 1) then
      exists = false
      break
     end
   end
   -- for end location

  end

  return exists
end


3、配置使用
(1)多个分组逻辑间通过英文逗号(,)隔开,同一分组参数间通过英文分号(;)隔开
(2)注意多个分组逻辑间可以使用相同的操作符;
(3)示例如下:
uri_relation_set=>mandatory,contain,exist,firm,begin,end
uri_key_group_set=>key_x;key_y;key_z,key_a;key_b,key_m;key_n,key_d=d1;key_e=e1;key_f=f1,key_w;part_value_w,key_o;part_value_o

【温馨提示】
如果您觉得满意,可以选择支持下,您的支持是我最大的动力:

分享到:
评论

相关推荐

    Laravel开发-laravel-query-param

    在Laravel框架中,`laravel-query-param`通常指的是如何在路由、控制器和查询构建器中处理URL查询参数。Laravel提供了优雅的方式来处理HTTP请求,包括查询参数,这对于开发高效和用户友好的API或者Web应用至关重要。...

    Laravel开发-laravel-query-param .zip

    $keyword = $request->input('keyword'); $category = $request->input('category'); // 进行搜索操作,例如: $results = Model::where('keyword', $keyword)->where('category', $category)->get(); return...

    spring配置中<context-param> 和<init-param>的 区别

    &lt;param-value&gt;/WEB-INF/spring/appServlet/servlet-context.xml&lt;/param-value&gt; &lt;/context-param&gt; ``` 在这个例子中,`contextConfigLocation` 参数指定了Spring配置文件的位置,使得Servlet容器知道在哪里加载...

    Laravel开发-normalization-request-uri

    总的来说,`Laravel开发-normalization-request-uri`关注的是如何确保Laravel框架能够正确处理各种格式的请求URI,保证路由到正确的控制器和方法,提供一致的用户体验。通过对`normalization-request-uri-master`...

    npm-login-with-param:使用提供的参数登录到npm

    npm使用参数登录 一个简单的脚本,可从命令行登录npm,以防您没有交互式外壳, expect或其他任何花哨的东西。 该软件包允许您为登录过程提供参数,...npx npm-login-with-param 这个怎么运作 这是一个简单的子进程,

    PyPI 官网下载 | flake8-force-keyword-arguments-1.0.2.tar.gz

    而这个插件则专门针对强制使用关键字参数(keyword arguments)这一编程规范进行检查。 在Python中,关键字参数允许我们以更清晰、可读性更强的方式指定函数调用的参数,例如`function(param1=value1, param2=value...

    <context-param>与<init-param>的区别与作用

    &lt;param-name&gt;paramName&lt;/param-name&gt; &lt;param-value&gt;paramValue&lt;/param-value&gt; &lt;/context-param&gt; ``` `param-name`是参数的唯一标识,`param-value`是对应的值。`&lt;context-param&gt;`通常用于设置Spring框架的配置...

    mybatis-demo9-方法多参数@Param.zip

    在MyBatis中,`@Param`注解是用来处理方法中多个参数的情况,尤其是在编写自定义的Mapper接口时。这个注解允许我们为每个参数指定一个唯一的名称,以便在SQL语句中引用它们。下面我们将深入探讨`@Param`的使用、作用...

    node-request-slim

    $ npm install node-request-slim 测试 # 启动测试服务器 $ node test/server/app.js # 测试 $ mocha 参数 /** * @param {String || Object} options 必选,如果是string类型就认为是url * @param {String} ...

    ionic3-使用cordova创建自定义插件

    在本文中,我们将深入探讨如何使用Ionic 3和Cordova创建自定义插件,以便实现打印功能。这个过程包括理解这两个框架的工作原理,以及如何将它们结合在一起开发原生移动应用功能。 首先,让我们了解 Ionic 和 ...

    tomcat解决跨域访问问题配置

    &lt;param-value&gt;token,Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers&lt;/param-value&gt; --&gt; &lt;param-value&gt;Access-Control...

    解析web.xml中在Servlet中获取context-param和init-param内的参数

    在这里,`&lt;param-name&gt;`标签定义了参数名,`&lt;param-value&gt;`标签定义了参数值。要从Servlet中获取`context-param`,可以通过以下代码实现: ```java String contextParamValue = getServletContext()....

    TP5 Request 请求对象

    $safeName = $request-&gt;param('name', '', 'htmlspecialchars'); ``` 这里,`htmlspecialchars`是过滤函数,确保了返回的安全性。 最后,`Request`对象还允许我们获取服务器信息,如客户端IP地址: ```php $ip = ...

    图片处理 这是一个强大的图片处理方案

    &lt;param-name&gt;baseDir&lt;/param-name&gt; &lt;param-value&gt;/UserFiles/&lt;/param-value&gt; &lt;/init-param&gt; &lt;init-param&gt; &lt;param-name&gt;debug&lt;/param-name&gt; &lt;param-value&gt;true&lt;/param-value&gt; &lt;/init-param&gt; ...

    使用SpringBoot-JPA进行自定义保存及批量保存功能

    使用SpringBoot-JPA进行自定义保存及批量保存功能 使用SpringBoot-JPA进行自定义保存及批量保存功能是指在Spring Boot应用程序中使用JPA(Java Persistence API)来实现自定义的保存和批量保存功能。JPA是一个Java ...

    apache-tomcat-9.0.22.7z

    &lt;param-value&gt;Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers&lt;/param-value&gt; &lt;/init-param&gt; &lt;init-param&gt; &lt;param-name&gt;cors.exposed.headers&lt;/...

    tomcat跨域jar.zip

    &lt;param-value&gt;Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers&lt;/param-value&gt; &lt;/init-param&gt; &lt;!-- 是否允许浏览器缓存预检请求的结果 --&gt; &lt;init-...

    geoserver跨域问题解决文件

    &lt;param-value&gt;Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers&lt;/param-value&gt; &lt;/init-param&gt; &lt;init-param&gt; &lt;param-name&gt;cors.exposed.headers&lt;/...

    SQLite3 的简单封装

    // param----begin----param // file : 文件名,包括路径 // param-----end-----param // return 0 成功,-1 失败 */ int open(char* file); /* // func name: get_res // param----begin----param // sql:...

Global site tag (gtag.js) - Google Analytics