Grails:从被调用的方法重定向

时间:2015-02-27 10:45:55

标签: grails redirect

早安社区。

我使用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,但我需要为每个方法传递自定义参数。

谢谢, 罗布。

2 个答案:

答案 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
}