如何判断请求URL中是否存在@PathVariable?
How to judge if a @PathVariable exists in request URL?
我正在尝试在网关上编写 api 权限过滤器。应禁止不具备特定角色的代币访问资源。除了包含 @PathVariable
参数的 apis 之外,所有请求都已被有效过滤。例如,URI /api/v1/query/{id}
的 api,参数 id
在某些情况下可能是 uuid
,在其他情况下可能是 long
值.
除了添加越来越多的 Regex 模式之外,还有更好的方法吗?网关的总体目标是消耗尽可能少的时间。
无论如何我想出了一个合适的解决方案。所有项目中的@PathVariable
都位于URL中的最后或最后两部分。例如/api/v1/data/query/{uid}/{pid}
或类似的东西。所以我们可以使用 Apache Common 的 StringUtils#lastIndexOf()
和 StringUtils#substring()
.
来消除那部分
要编写演示代码,请同时导入 Hutool 和 Commons-Lang3。
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
import cn.hutool.core.util.IdUtil;
import org.apache.commons.lang3.StringUtils;
public class StringDemo {
public static void main(String[] args) {
String url = "http://localhost:8080/api/v1/data/query/" + IdUtil.simpleUUID() + "/" + IdUtil.getSnowflake(1L, 16).nextId();
System.out.println(url);
int index = StringUtils.lastIndexOf(url, "/");
String subUrl = StringUtils.substring(url, 0, index);
System.out.println(subUrl);
int index2 = StringUtils.lastIndexOf(subUrl, "/");
String subOfSubUrl = StringUtils.substring(url, 0, index2);
System.out.println(subOfSubUrl);
}
}
结果如下:
http://localhost:8080/api/v1/data/query/19280769925f43d98b2af405579955ac/1356927788629626880
http://localhost:8080/api/v1/data/query/19280769925f43d98b2af405579955ac
http://localhost:8080/api/v1/data/query
通过将uri简化到最简单,我的例子是/api/v1/data/query
,很容易写出相关的代码来检查角色。
我正在尝试在网关上编写 api 权限过滤器。应禁止不具备特定角色的代币访问资源。除了包含 @PathVariable
参数的 apis 之外,所有请求都已被有效过滤。例如,URI /api/v1/query/{id}
的 api,参数 id
在某些情况下可能是 uuid
,在其他情况下可能是 long
值.
除了添加越来越多的 Regex 模式之外,还有更好的方法吗?网关的总体目标是消耗尽可能少的时间。
无论如何我想出了一个合适的解决方案。所有项目中的@PathVariable
都位于URL中的最后或最后两部分。例如/api/v1/data/query/{uid}/{pid}
或类似的东西。所以我们可以使用 Apache Common 的 StringUtils#lastIndexOf()
和 StringUtils#substring()
.
要编写演示代码,请同时导入 Hutool 和 Commons-Lang3。
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
import cn.hutool.core.util.IdUtil;
import org.apache.commons.lang3.StringUtils;
public class StringDemo {
public static void main(String[] args) {
String url = "http://localhost:8080/api/v1/data/query/" + IdUtil.simpleUUID() + "/" + IdUtil.getSnowflake(1L, 16).nextId();
System.out.println(url);
int index = StringUtils.lastIndexOf(url, "/");
String subUrl = StringUtils.substring(url, 0, index);
System.out.println(subUrl);
int index2 = StringUtils.lastIndexOf(subUrl, "/");
String subOfSubUrl = StringUtils.substring(url, 0, index2);
System.out.println(subOfSubUrl);
}
}
结果如下:
http://localhost:8080/api/v1/data/query/19280769925f43d98b2af405579955ac/1356927788629626880
http://localhost:8080/api/v1/data/query/19280769925f43d98b2af405579955ac
http://localhost:8080/api/v1/data/query
通过将uri简化到最简单,我的例子是/api/v1/data/query
,很容易写出相关的代码来检查角色。