Grails - добавить заголовок к каждому ответу - PullRequest
8 голосов
/ 20 июня 2011

Как я могу добавить заголовок ответа - скажем, X-Time, который будет выглядеть примерно так:

X-Time: 112

Где указанным значением будет время в миллисекундах, которое требуется для обработки ответа? Есть ли действительно простой способ добавить это в приложение Grails? Не то, что я хочу оставить навсегда, но было бы неплохо иметь это при разработке моего приложения.

1 Ответ

32 голосов
/ 20 июня 2011

Чтобы просто добавить заголовок к ответу, вы можете использовать after Фильтр.

// grails-app/conf/MyFilters.groovy
class MyFilters {
    def filters = {
        addHeader(uri: '/*') {
            after = {
                response.setHeader('X-Time', value)
            }
        }
    }
}

Редактировать:

Чтобы фактически вычислить время,вероятно, было бы более уместно использовать javax.servlet.Filter вместо фильтра Grails.

src / groovy / com / example / myproject / MyFilter.groovy

package com.example.myproject

import javax.servlet.*

class MyFilter implements Filter {

    void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {

        def start = System.currentTimeMillis()
        chain.doFilter(request, response)

        def elapsed = System.currentTimeMillis() - start
        response.setHeader('X-Time', elapsed as String)
    }

    void init(FilterConfig config) { }
    void destroy() { }
}

src / templates / war / web.xml (запустите grails install-templates, если src / templates еще не находится в вашем исходном дереве)

<filter>
  <filter-name>timer</filter-name>
  <filter-class>com.example.myproject.MyFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>timer</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Причина использования javax.servlet.Filter заключается в том, что вам не нужно выделять ваше "before" и«после» действий, и поэтому может удерживать время начала на протяжении всей цепочки фильтров и выполнения сервлета.

Дополнительное примечание:

Мне кажется страннымхотите вернуть истекшее время выполнения сервера в качестве заголовка ответа.Возможно, у вас есть достойная причина для этого, но в большинстве случаев я бы либо A) либо больше беспокоился об общем времени прохождения туда-обратно (как замечено клиентом), либо B) регистрировал истекшее время выполнения на сервере для моего сервера.собственные цели системного администрирования / метрики.

...