2013-06-04 115 views
3

我試圖自定義HTTP標頭添加到一組特定的使用Grails過濾器控制器的響應:添加自定義標頭響應之後「呈現爲JSON」

class ApiFilters { 
    def filters = { 
     xwingFilter(uri:'/api/**') { 
     after = { 
      response.setHeader('X-Wing', 'foo') 
     } 
     } 
    } 
} 

如果控制器呈現視圖或文本,標題被添加到響應中。 如果控制器使用「渲染爲JSON」,則不會添加標題。它看起來像JSON轉換器正在關閉輸出流並立即發送。是對的嗎?

我可以使用Grails攔截器,但我不得不在一個以上的控制器中複製它。 關於如何實現這一點的任何想法?

+0

您可以在afterInterceptor動態地添加到所有控制器啓動(Bootstrap.groovy)。 –

+0

這可以工作。我想也有一個基地控制器與攔截器,並從它延伸。謝謝。 – chozero

回答

4

您可以從模型做翻譯,以JSON的過濾器,而不是動作:

控制器:

class myController { 
    def myAction() { 
     [aThing: 1, anotherThing: [a: 1, b: 2]] 
    } 
} 

過濾器:

class ApiFilters { 
    def filters = { 
     xwingFilter(uri:'/api/**') { 
      after = { model -> 
       response.setHeader('X-Wing', 'foo') 
       render model as JSON 
       return false // prevent normal view from rendering 
      } 
     } 
    } 
}