Grails 3 拦截器
Grails 3 Interceptor
我的应用程序是 运行 在 Grails 3.2.10 中使用 Java 1.8.0_72.
我有一个拦截器,我在拦截器的 matchAll 上指定 uri 排除模式:
matchAll().excludes(uri:'/myController/test')
然而,为了在不使用通配符的情况下完成这项工作(这个拦截器在一个插件中,所以我们希望保持 uri 排除模式相当具体),我还必须添加一个额外的排除模式,但具有相同的 uri包含应用程序名称:
.excludes(uri:'/myApp/myController/test')
在查看 Grails 代码时,我看到调用了 grails.artefact.Interceptor.groovy:doesMatch(request) 方法来计算匹配。以下是 doesMatch 方法的代码片段:
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
doesMatch 依次调用 UrlMappingMatcher:isExcluded 并在 'uriExcludePatterns' 上循环。而且,由于同时使用 'uri' 和 'noCtxUri' 调用了 doesMatch,这似乎就是我必须在我的排除模式中指定两个 uris 的原因。
我确信在 'uri' 和 'noCtxUri' 上调用 doesMatch 是有充分理由的。如果有人有解释,我很想知道为什么。
这是一个错误,如果您尚未更新版本,已在 Grails 3.3.3 中修复。
你可以参考这个https://github.com/grails/grails-core/pull/10912
我的应用程序是 运行 在 Grails 3.2.10 中使用 Java 1.8.0_72.
我有一个拦截器,我在拦截器的 matchAll 上指定 uri 排除模式:
matchAll().excludes(uri:'/myController/test')
然而,为了在不使用通配符的情况下完成这项工作(这个拦截器在一个插件中,所以我们希望保持 uri 排除模式相当具体),我还必须添加一个额外的排除模式,但具有相同的 uri包含应用程序名称:
.excludes(uri:'/myApp/myController/test')
在查看 Grails 代码时,我看到调用了 grails.artefact.Interceptor.groovy:doesMatch(request) 方法来计算匹配。以下是 doesMatch 方法的代码片段:
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
doesMatch 依次调用 UrlMappingMatcher:isExcluded 并在 'uriExcludePatterns' 上循环。而且,由于同时使用 'uri' 和 'noCtxUri' 调用了 doesMatch,这似乎就是我必须在我的排除模式中指定两个 uris 的原因。
我确信在 'uri' 和 'noCtxUri' 上调用 doesMatch 是有充分理由的。如果有人有解释,我很想知道为什么。
这是一个错误,如果您尚未更新版本,已在 Grails 3.3.3 中修复。 你可以参考这个https://github.com/grails/grails-core/pull/10912