Interceptor
In Grails, interceptor use the concept of Aspect Oriented Programming (AOP) to intercept the programming logic before or after a controller method. Here we will create an ApiInterceptor
which will intercept all the method in a controller ApiController
before they are being called.
Create an Interceptor
- In your OS terminal, cd to your project directory
- type
grails
to enter grails mode - type
create-interceptor Api
. This will create the file ApiInterceptor.groovy under the project/grails-app/controllers/PACKAGENAME/
Intercept the Controller Methods
We are going to intercept all methods in ApiController
. To do this, we need to tell ApiInterceptor
about it in its constructor.
ApiInterceptor() { match(controller: "api") }
Inside the interceptor class, there are three methods:
- boolean before() {…}
- boolean after() {…}
- void afterView() {…}
The before() method will be called before the controller's methods begin called. Likewise, the after() method will be called after a method from ApiController
is called. Both before() and after() return a boolean. If we return true, that means Grails should continue the normal routine. If we return false, it means we intercepted the routine, and we are suppose to handle what the HTTP response for the client.
Intercept in before()
Here, we are going to stop the user calling any of our api methods. This can be easily done by:
boolean before() { response.status = 401 render(text: "Unauthorized access") return false }
Of course, you can add some logic there to make this example more interesting. For example, we can add the checking in the request header to see if it contains some sort of token that match to our database. Like what we do in Grails's controller, we can access the variable request
, and response
inside an interceptor.