我有一个运行正常的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
对此有何建议?
答案 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
}