Implementing Pass-Through with Grails Filters

259 Views Asked by At

Please note: Although I'm using the Grails Webflow plugin here, I am pretty sure this is just a generic question that any battle-weary Grails veteran could answer.


Grails 2.4.4 here. I have a need for a Grails Filter that inspects all traffic coming into a particular controller. If the app is in a particular state, I need to redirect traffic to another controller/action. Else, I need the filter to act as a no-op/pass-through filter (meaning it does nothing; just allows the request to pass through it and on to its intended destination):

package filters

class MyAppFilters {
    def filters = {
        fizzFilter(controller: 'fizz', action: '*') {
            before = {
                if(AppStateHolder.checkState() == AppState.Blue) {
                    redirect(controller: 'auth', action: 'unauthorized')
                    return false
                } else {
                    // Allow request to continue on to its intended controller/action target ('no-op'/pass-through)
                    ???
                }
            }
        }
    }
}

I have everything working perfectly for when the app state is AppState.Blue (so, the if-condition). The problem is that when app state isn't "blue", and that else executes, I keep getting infinite redirect errors. I believe Grails Webflow is complicating things, but I can't really fix anything with how it has been implemented.

I've also tried returning true/false from inside the else like so:

} else {
    // Allow request to continue on to its intended controller/action target ('no-op'/pass-through)
    return false // Also tried 'true'
}

But this produces the same infinite redirect errors. It looks like I need to do some kind of redirect/render/etc. inside this else or webflow will cause problems.

So I'm looking for a way to tell Grails to redirect to whatever was the controller/action off the request. Something like:

} else {
    // Allow request to continue on to its intended controller/action target ('no-op'/pass-through)
    redirect(controller: req.controller, action: req.action)
    return false
}

Is this possible, if so, how (specifically)?

0

There are 0 best solutions below