Session Grails过滤器在运行后停止工作

Session Grails过滤器在运行后停止工作,session,grails,before-filter,Session,Grails,Before Filter,我有一个过滤器设置如下,以控制用户登录状态 class SecurityFilters { def filters = { login(controller:'login|logout|proxy|API|error', action:'*', invert: true) { before = { if (!session.isLoggedIn){ switch(controllerName){ case "en

我有一个过滤器设置如下,以控制用户登录状态

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 truth方面遇到了一些问题。我所看到的问题是没有记录任何错误,即使有激进的异常捕获(即捕获Throwable),浏览器中唯一的输出是空白页。这似乎只发生在过滤器中,其他地方都会记录错误

在我的例子中,这个问题归结为一个很好的事实。我试图在会话上设置布尔属性,但每次都失败了。最后,我不得不将值转换为字符串,然后设置它,它就工作了

我知道这不是一个直接的答案,但我已经被上面提到的,例如,懒惰的GString评估,咬了几口


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

进一步研究后,我认为这可能是一个在2.3中解决的错误,但不幸的是,我无法将grails版本升级到此项目,因为它处于维护模式。我的临时解决方案是在每个控制器方法的顶部添加检查。很难看,但它完成了任务。