Grails过滤器在之后停止工作



我有一个如下设置的过滤器来控制用户的登录状态。

class SecurityFilters {
def filters = {
login(controller:'login|logout|proxy|API|error', action:'*', invert: true) {
before = {
if (!session.isLoggedIn){
switch(controllerName){
case "enroll":
switch(actionName){
...
default:
log.warn "Permission Denied. Default action for enroll."
render(view: '/permissionDenied', model: [message: "You must be logged in to access the enroll system.  If you are a consumer, please contact your agent for more information."])
break
}
break
...
}
else {
switch(controllerName){
case "agent":
if (!session.user.isAgent) {
render view: "/permissionDenied", model: [message: 'This portion of the site is only available to agents.']
return false
}
break
....
}// switch
}// else
}// before
...
}// login
}// filters

我遇到的问题是,当我在开发中运行它时,它运行得很好,但当我在我们的QA系统上运行时,它会运行一段时间,然后突然停止正常工作。

我添加了日志记录,可以看到会话信息在过滤器中可用,会话变量(session.user.isAgent)设置正确(true),但if(!session.user.isAgent)中的代码无论如何都会被执行。

我似乎找不到奇怪行为的原因。

我的问题是,以前有人见过这种行为吗?他们是如何解决的,或者知道在哪里寻找过滤器工作方式突然改变的可能原因。

提前谢谢。

更新(2014年2月19日):在添加了更多日志以查找原因后,筛选器没有像以前那样执行if(!session.user.isAgent)中的代码。现在它正常运行,然后在用户未登录时只执行渲染行。日志记录仍然显示用户已登录,并且他是代理,但随后它运行渲染,而不是上面的代码行。这就好像在完成检查代理是否已登录后,有一个"转到"渲染行。

将再次感谢任何信息或解决方案

我在过滤器和Groovy真相方面遇到了一些问题。我看到的问题是,即使有激进的异常捕获(即捕获Throwable),也没有记录任何错误,并且浏览器中唯一的输出是一个空白页面。这种情况似乎只发生在过滤器中——其他任何地方都会记录错误。

在我的案例中,问题在于Groovy的真实性。我试图在会话上设置一个布尔属性,但每次都失败了。最后,我不得不将该值转换为String,然后进行设置,结果就成功了。

我知道这不是一个直接的答案,但我已经被上面的问题咬过几次了,例如,懒惰的GString评估。

如果您仍在调试,我会记录一些输出,显示您认为正在处理的底层Class类型。当您的布尔条件在上面求值时,可能会抛出并吞下异常。我会记录每个条件语句的实际值,看看它们是什么。还要逐个删除每一行,看看故障是否消失。和/或将条件语句替换为绝对值,即true/false,以查看代码是否得到执行。如果是,则表明当前条件求值中存在错误。

最新更新