1

我正在试验 Grails 3 及其拦截器的新概念。给定以下拦截器/控制器:

class AuthInterceptor {
    // ...other stuff in here

    boolean before() {
        if(FizzBuzz.isFoo()) {
            redirect(controller: auth, action: signin)
            true
        } else {
            true
        }
    }
}

class AuthController {
    AuthService authService

    def signin() {
        String username = params[username]
        String password = params[password]
        user = authService.authenticate(username, password)

        if(user) {
            SimpleSecurityUtils.setCurrentUser(user)
            redirect(url: ??? INTENDED_DESTINATION ???)
        } else {
            // Auth failed.
            redirect(action: failed)
        }
    }
}
  1. AuthService是一个Grails 服务。我希望AuthService每个实例都有一个AuthController. 而且我希望AuthController有一个prototype范围,这样我就永远不会存储状态,并且为每个请求创建一个控制器。为了满足这些范围要求,我必须在两个 ( AuthService/ ) 中进行哪些更改?AuthController
  2. 假设AuthController#signin由于redirect(controller:auth, action: signin)拦截器内部而执行,我如何从上面的控制器操作内部将用户重定向(再次)到他们的预期目的地(即,在拦截器拦截请求之前他们想去的 URL)?
4

1 回答 1

1

首先,如果你重定向到另一个 URL,你必须返回 false 来取消渲染过程,例如

 redirect(controller: auth, action: signin)
 false

其次,如果您想返回预览预期的 URL,您必须将其保存到会话中,然后在完成登录过程后重定向到保存的 URL。

于 2017-02-05T03:05:18.913 回答