Grails 2.1.1:重定向到/index.gsp不能使用Filter定义

时间:2012-11-07 15:17:40

标签: grails redirect filter

我有一个运行正常的Grails 2.1.1应用程序,至少在我尝试为所有Controller定义过滤器时,如果index.gsp未设置为user,则会重定向到session AuthenticationController变量......

我尝试过什么,我无法重定向到“/ index”,也无法在启动服务器时呈现“/ index” - 如果我删除过滤器并从我的{{1}重定向到“/ index”在假参数上,所有的作品都像魅力......

所以,这是我到目前为止所拥有的:

class AuthenticationFilters {
  all(controller:'*', action'*') {
    before = {
      def user = (User) session.getValue("user")
      if(user == null || !user.loginState) {
        redirect(controller: 'authentication', action: 'index')
        return false
      }
    }
  }
}

class AuthenticationController {
  def authenticationService

  def index = {
    render(view: '/index')
  }

  def login(LoginCommand cmd) {
    if(cmd.hasErrors()) {
      redirect(action: index)
      return
    }
  }
  ....
}

现在,如果我注释掉all过滤器定义,一切都运行良好。我在启动时显示了页面(index.gsp),如果LoginCommand有错误,我会被重定向到index.gsp页面而没有任何问题。 如果我现在在all过滤器定义中发表评论,我会得到一个404

我试过了: Grails: Redirect to index.gsp that is not in any controller Upgrade to Grails 2.0: /index.gsp not found Grails: what are the main issues (and his solutions) when deploying in weblogic?

但我没有运气......

我正在开发Intellij IDEA 11.1.4 Premium(评估)


编辑:我尝试从User类中的session属性获取AuthenticationFilters对象,并被try/catch块包围,现在面临的问题显然session属性不可用?为什么呢?

try {
        def user = (User) session.getValue("user")
        if((user == null || !user.loginState)) {
            ...
        }
    } catch(Exception e) {
        println("... couldn't get user from session! ${e.getMessage()}")
    }

控制台输出:

... couldn't get user from session! No such property: session for class: grailstest001.AuthenticationFilters

对此有何建议?

2 个答案:

答案 0 :(得分:4)

所以,只是在这里添加我的经验来解决这个问题并将其用于其他用户:

要检查用户是否第一次进入该页面,您可以通过检查controllerName字段轻松完成此操作。如果用户未被任何控制器引用到该站点,则它应为null""(空字符串)。

另外,我没有在我的应用程序中使用任何数据库进行身份验证,因为所有这些问题都由API提供。所以我创建了一个UserService.groovy类,它充当SessionScopedBean,我将所有与用户相关的信息存储在这个类中。

因此,您的过滤器定义可能如下所示:

class MyFilters {
  def filters = {
    before = {
      if(!controllerName || controllerName.equals("")) {
        redirect(controller:'home',action:'index')
      }
      if(!applicationContext.userService?.getUser() || !applicationContext.userService?.getUser.isLoggedIn) {
        redirect(controller:'auth',action:'login')
      }
    }
  }
}

否则,如果您不想重定向从Filters.groovy课程中“刚刚”进入您网页的用户,您可以使用UrlMappings.groovy课程来执行此操作。只需将/(根)索引映射到您想要的页面:

class UrlMappings {
  static mappings = {
    "/"(controller:'mycontroller',action:'myaction') // change it to your liking
    "/$controller/$action?/$id?" {
      constraints {
        // apply constraints here
      }
    }
    "500"(view:'/error')
  }
}

答案 1 :(得分:1)

我认为您的过滤器语法可能不正确 - 请尝试

Class AuthenticationFilters {
  def filters = { // <--- added this
    all(controller:'*', action'*') {
      before = {
        def user = (User) session.getValue("user")
        if(user == null || !user.loginState) {
          redirect(controller: 'authentication', action: 'index')
          return false
        }
      }
    }
  } // <-- added
}