Добавьте заголовок ответа на каждый запрос в инцепторе Grails 3 - PullRequest
4 голосов
/ 11 октября 2019

Я хочу добавить этот пользовательский заголовок к каждому ответу в моем API покоя:

"customHeader": "foo"

Для этого я создал перехватчик grails, который соответствует каждому контроллеру и позволяет мне изменять запрос.

class FooInterceptor {

    FooInterceptor() {
        matchAll()
    }

    boolean before() { true }

    boolean after() {
        header 'customHeader', "foo" //first try
        response.addHeader 'customHeader', "foo" //second try to do the same
        response.setHeader 'customHeader', "foo" //third try, setHeader doesn't work either
        true
    }

    void afterView() {
    }
}

Я отладил и вижу, что после ответа контроллера вызывается метод after:

respond([status:dodes.OK], [:])

Я ясно вижу, что мой перехватчик вызывается, а addHader не выдает никакихисключение, но мой заголовок просто не добавляется к окончательному ответу.

Я предполагаю, что, возможно, метод ответа Grail каким-то образом "блокирует" ответ, так что заголовок не может быть добавлен после, но я не уверен.

Как добавить заголовок к каждому ответу на Grails 3, используя перехватчик?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

В одном из моих проектов я использую setHeader вместо addHeader, и он работает.

Вы можете попробовать это:

class FooInterceptor {

    FooInterceptor() {
        matchAll()
    }

    boolean before() { true }

    boolean after() {
        response.setHeader('customHeader', 'foo')
        true
    }

    void afterView() {
    }
}

Объект ответа является экземпляром класса HttpServletResponse API сервлетов,Читая документацию, я вижу, что оба метода доступны. Разница в том, что с addHeader вы можете добавить несколько значений в конкретный заголовок, тогда как начальное значение будет перезаписано, если вы используете метод setHeader.

Подробнее об этом можно прочитать здесь: https://docs.grails.org/3.3.9/ref/Controllers/response.html

1 голос
/ 11 октября 2019

У меня работает следующее. Возможно, вам придется использовать перед () вместо.

class FooInterceptor {

    FooInterceptor() {
        match controller: '*', action: '*'
    }

    boolean before() {
        response.setHeader('customHeader', "foo") 
        true
    }

    boolean after() { true }

    void afterView() {
      // no-op
    }
}
...