早安社区。 p>
我使用Grails作为后端应用程序,因此想要检查是否允许用户执行请求的操作。
所以我在开始时调用checkPermission(),如果不允许用户,则重定向到索引页面。但是我发生了这个错误:
此处无法发出重定向(..)。之前对重定向(..)的调用已经重定向了响应。
摘自我的来源:
def test() {
println("test()")
checkPermission([TaskXYZ])
println("AfterCheck")
redirect(action: "profile", params: [lang: params.lang])
}
private checkPermission(def tasks) {
println("checkPermission()")
if ( ! userService.isAllowed(tasks)) {
println("NotAllowed")
flash.error = message(code: "msg.actionIsNotAllowed")
redirect(action: "index", params: [lang: params.lang])
return false
}
}
输出:
test()
checkPermission()
NotAllowed
AfterCheck
因此,重定向不会从私有方法起作用,返回false会导致返回被调用方法。
我还能做什么?我考虑过beforeInterceptor,但我需要为每个方法传递自定义参数。
谢谢, 罗布。
答案 0 :(得分:2)
您遇到的问题是发出重定向并不会停止执行控制器方法/操作。在redirect
checkPermission
之后,您的控制器代码会在checkPermission
之后继续执行并遇到下一个redirect
。如果return
要终止执行控制器方法/操作,则需要从控制器checkPermission
。
例如:
...
private boolean checkPermission(def tasks) { ... }
...
if (!checkPermission([TaskXYZ])) return
...
答案 1 :(得分:1)
你不能在一次请求中调用redirect()方法两次,尽管这是你的代码正在做的事情,但你可以通过多种方式改变它,即
def test() {
boolean hasPermission = checkPermission([TaskXYZ])
if (!hasPermission) {
return ; // you have to finish the action, because you already called redirect inside checkPermission() method
}
// do further actions when permission granted
redirect(action: "profile", params: [lang: params.lang])
}
private checkPermission(def tasks) {
if ( ! userService.isAllowed(tasks)) {
return false
}
return true
}
您还可以改进它,以便您可以进行不同的重定向:
def test() {
boolean checkPermissionResult = checkPermission([TaskXYZ])
if (checkPermissionResult != null) {
return redirect(checkPermissionResult)
}
// do further actions when permission granted
redirect(action: "profile", params: [lang: params.lang])
}
private checkPermission(def tasks) {
if ( ! userService.isAllowed(tasks)) {
return [action: "index", params: [lang: params.lang]]
} else if (userService.userNotExists()) { // or any different situatoin
return [action: "register", params: [lang: params.lang]]
}
return null
}