gpt4 book ai didi

grails - 如何从 grails 过滤器中去除通用逻辑?

转载 作者:行者123 更新时间:2023-12-01 10:55:55 25 4
gpt4 key购买 nike

这是专门针对 grails 1.3.7 应用程序的,但希望答案也适用于较新的版本。下面的代码是所需内容的简化版本。 accountService 正在被注入(inject)。下面的代码片段做了它应该做的,但显然是重复的代码。这是位于 grails-app/conf 的 UserFilter 类中

如何从我的过滤器中提取通用逻辑并保持重定向和检查 session 的能力?我已经尝试将方法提取到过滤器类中,传入 session 和闪存,但重定向仍然给我带来问题。

def filters = {
// ... other filters ...
adminAllCheck(controller: 'administration', action: '*') {
before = {
if(!session.isAdmin) {
if(accountService.isAdmin()) {
session.isAdmin = true
} else {
flash.message = 'Non admin'
redirect(controller: 'home', action: 'index')
return false
}
}
true
}
}
userListCheck(controller: 'user', action: 'list') {
before = {
if(!session.isAdmin) {
if(accountService.isAdmin()) {
session.isAdmin = true
} else {
flash.message = 'Non admin'
redirect(controller: 'home', action: 'index')
return false
}
}
true
}
}
}

最佳答案

创建辅助方法的一种方法是在 filters 闭包之外创建它,并将实例传入。传入 this 是行不通的,因为那不是闭包,而是 UserFilters 实例。而是传入闭包的 delegate,这是添加 renderredirect 方法的地方,其中 params 等属性和 controllerName 是:

class UserFilters {
def filters = {
// ... other filters ...
adminAllCheck(controller: 'administration', action: '*') {
before = {
doAdminCheck(delegate)
}
}
userListCheck(controller: 'user', action: 'list') {
before = {
doAdminCheck(delegate)
}
}
}

private boolean doAdminCheck(filters) {
if (!filters.session.isAdmin) {
if (accountService.isAdmin()) {
filters.session.isAdmin = true
}
else {
filters.flash.message = 'Non admin'
filters.redirect(controller: 'home', action: 'index')
return false
}
}
true
}
}

您还可以在 controlleraction 参数中使用 | 字符来跨 Controller 执行常见工作。它不会在这里直接工作,因为您使用 * 作为管理 Controller 并且仅适用于用户 Controller 中的 list 操作,但您可以执行显式 Controller /操作名称检查:

adminCheck(controller: 'administration|user', action: '*') {
if (controllerName == 'user' && actionName != 'list') {
return true
}
// common logic here
}

您还可以将逻辑移动到服务中,然后将依赖项注入(inject)到服务中。混合这样的层并在服务中包含 HTTP 逻辑通常不是一个好主意,但这会将逻辑保留在一个地方。您可以对委托(delegate)使用相同的技巧,或者只是传入 session /请求/响应/等。根据需要。

关于grails - 如何从 grails 过滤器中去除通用逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com