Grails 3 Interceptor

时间:2017-06-28 21:55:09

标签: grails interceptor grails3

我的应用程序使用Java 1.8.0_72在Grails 3.2.10中运行。

我有一个拦截器,我在拦截器上指定uri排除模式匹配所有:

matchAll().excludes(uri:'/myController/test')

然而,为了使这项工作不使用通配符(这个拦截器在插件中,所以我们希望保持uri排除模式非常具体),我还必须添加一个额外的排除模式与相同的uri但包含应用程序名称:

.excludes(uri:'/myApp/myController/test')

在查看Grails代码时,我看到调用grails.artefact.Interceptor.groovy:doMatch(request)方法来计算匹配。以下是doMatch方法的代码片段:

for(Matcher matcher in allMatchers) {
    if(matcher.doesMatch(uri, grailsMappingInfo, req.method) ||
      (checkNoCtxUri && matcher.doesMatch(noCtxUri, grailsMappingInfo, req.method))) {
        return true // true results in my interceptor executing
    }
}
return false // false results in skipping my interceptor

doMatch依次调用UrlMappingMatcher:isExcluded,它循环遍历&uriExcludePatterns'。并且,因为doMatch与“uri”同时被调用。和' noCtxUri',这似乎是我必须在我的排除模式中指定两个uris的原因。

我确定有一个很好的理由可以在“&uri”上调用“匹配”。和' noCtxUri'。如果有人有解释,我很想知道原因。

1 个答案:

答案 0 :(得分:1)

这是一个错误,如果您还没有更新版本,请在Grails 3.3.3中修复。 您可以参考此https://github.com/grails/grails-core/pull/10912