我有一个grails 2.2.0应用程序。我已经创建了一个全局过滤器,并且有一些检查。如果检查失败,则它使用渲染视图呈现静态视图文件:viewFileName结束流,否则返回true表示app可以继续。 在登录操作时,操作会呈现一个调用渲染视图的登录视图:loginFileName,但它会显示viewFileName。请注意,过滤器传递现在已经过去了,并且检查过了。 这个问题与之前的帖子类似 Grails "respond" renders the wrong view when launched from .war file 但不同的是,有两个同名的索引视图文件,但在不同的控制器中,但在这里我们有过滤器渲染视图,如果某些条件通过,即使该条件失败也会显示。 为了确保这是一个问题,我删除了渲染视图:使用渲染“< div> ....< / div>”的过滤器中的viewFileName然后它运作良好,即动作显示正确的页面而不是静态页面。 如果需要,我可以发布更多细节。我不能依赖于字符串中的那个页面来呈现,因为这不是长期的。 以下是带有问题的两个类
class MainController {
def login() {
def param = getHeaderParameters()
render view: "login", model: param
}
}
class MainFilters {
private final String mainControllerName = "main"
private final String startPage = "start"
def GrailsConventionGroovyPageLocator groovyPageLocator
def filters = {
all(controller: '*', action: '*') {
before = {
if (AdminUtils.isStart(request)) {
println "rending start page...."
final fileView = "/$mainControllerName/$startPage"
render view: fileView
}
}
}
}
答案 0 :(得分:1)
当您渲染页面而不是重定向页面时,如果您没有返回false,则会在之前的检查之后调用您的操作。对于您的场景,您不希望调用您的操作,因此您需要在此之后返回false。
def filters = {
all(controller: '*', action: '*') {
before = {
if (AdminUtils.isStart(request)) {
println "rending start page...."
final fileView = "/$mainControllerName/$startPage"
render view: fileView
return false
}
}
}
}