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`通常指的是如何在路由、控制器和查询构建器中处理URL查询参数。Laravel提供了优雅的方式来处理HTTP请求,包括查询参数,这对于开发高效和用户友好的API或者Web应用至关重要。...
$keyword = $request->input('keyword'); $category = $request->input('category'); // 进行搜索操作,例如: $results = Model::where('keyword', $keyword)->where('category', $category)->get(); return...
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value> </context-param> ``` 在这个例子中,`contextConfigLocation` 参数指定了Spring配置文件的位置,使得Servlet容器知道在哪里加载...
总的来说,`Laravel开发-normalization-request-uri`关注的是如何确保Laravel框架能够正确处理各种格式的请求URI,保证路由到正确的控制器和方法,提供一致的用户体验。通过对`normalization-request-uri-master`...
npm使用参数登录 一个简单的脚本,可从命令行登录npm,以防您没有交互式外壳, expect或其他任何花哨的东西。 该软件包允许您为登录过程提供参数,...npx npm-login-with-param 这个怎么运作 这是一个简单的子进程,
而这个插件则专门针对强制使用关键字参数(keyword arguments)这一编程规范进行检查。 在Python中,关键字参数允许我们以更清晰、可读性更强的方式指定函数调用的参数,例如`function(param1=value1, param2=value...
<param-name>paramName</param-name> <param-value>paramValue</param-value> </context-param> ``` `param-name`是参数的唯一标识,`param-value`是对应的值。`<context-param>`通常用于设置Spring框架的配置...
在MyBatis中,`@Param`注解是用来处理方法中多个参数的情况,尤其是在编写自定义的Mapper接口时。这个注解允许我们为每个参数指定一个唯一的名称,以便在SQL语句中引用它们。下面我们将深入探讨`@Param`的使用、作用...
$ npm install node-request-slim 测试 # 启动测试服务器 $ node test/server/app.js # 测试 $ mocha 参数 /** * @param {String || Object} options 必选,如果是string类型就认为是url * @param {String} ...
在本文中,我们将深入探讨如何使用Ionic 3和Cordova创建自定义插件,以便实现打印功能。这个过程包括理解这两个框架的工作原理,以及如何将它们结合在一起开发原生移动应用功能。 首先,让我们了解 Ionic 和 ...
<param-value>token,Access-Control-Allow-Origin,Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> --> <param-value>Access-Control...
在这里,`<param-name>`标签定义了参数名,`<param-value>`标签定义了参数值。要从Servlet中获取`context-param`,可以通过以下代码实现: ```java String contextParamValue = getServletContext()....
$safeName = $request->param('name', '', 'htmlspecialchars'); ``` 这里,`htmlspecialchars`是过滤函数,确保了返回的安全性。 最后,`Request`对象还允许我们获取服务器信息,如客户端IP地址: ```php $ip = ...
<param-name>baseDir</param-name> <param-value>/UserFiles/</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> ...
使用SpringBoot-JPA进行自定义保存及批量保存功能 使用SpringBoot-JPA进行自定义保存及批量保存功能是指在Spring Boot应用程序中使用JPA(Java Persistence API)来实现自定义的保存和批量保存功能。JPA是一个Java ...
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</...
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <!-- 是否允许浏览器缓存预检请求的结果 --> <init-...
<param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</...
// param----begin----param // file : 文件名,包括路径 // param-----end-----param // return 0 成功,-1 失败 */ int open(char* file); /* // func name: get_res // param----begin----param // sql:...