URL迭代非迭代匹配

时间:2016-08-31 06:50:30

标签: java tomcat pattern-matching uri

我有http路径和方法的列表。例如:

GET /spaceshuttles/{id}
POST /{version}/order

根据我的理解,当有传入请求时,迭代地比较这些路径,在第一场比赛时停止。 我的问题是 - 这是否有性能影响?如果有一个服务处理1000个传入路由,那么性能会受到多大影响呢?

即使点击量很小,是否有一个干净的策略来匹配URL与树/特里匹配策略​​?如果是,那又怎样? 例如: 我希望将传入的URL与其中一个匹配,而不需要迭代匹配。 例如:对于 GET / spaceshuttles / 46 ,我应该获得 GET / spaceshuttles / {id}

的句柄

我需要这个用于我的网络应用过滤器,其中一些网址得到特殊处理。 目前我正在通过迭代我的列表进行匹配。我假设必须有一些库以高效的方式执行此操作。

1 个答案:

答案 0 :(得分:0)

我没有考虑到符合您需求的图书馆。我会选择一个自定义类RequestMatcher,使用Http方法保存正则表达式模式和Http方法或字符串:

class RequestMatcher {
    private Pattern urlPattern;
    private String httpMethod;

   public RequestMatcher(final String urlPattern, final String httpMethod) {
        this.urlPattern = Pattern.compile(urlPattern);
        this.httpMethod = httpMethod;
    }

    public boolean matches(final String url, final String httpMethod) {
        return httpMethod.equals(this.httpMethod) && this.urlPattern.matcher(url).matches();
    }

在您的过滤器中,您可以像这样使用它:

final RequestMatcher spaceShuttleMatcher = new RequestMatcher("/spaceshuttles/[0-9]+", "GET");
final RequestMatcher orderMatcher = new RequestMatcher("/[0-9]+\\.[0-9]+\\.[0-9]+/order", "POST");
boolean isSpaceShuttleRequest = spaceShuttleMatcher.matches("/spaceshuttles/123", "GET");
boolean isOrderMatcher = orderMatcher.matches("/1.2.3/order", "POST");