Grails - 为每个响应添加标头

时间:2011-06-20 18:03:53

标签: performance grails http-headers aop

我怎样才能添加一个响应头 - 比如X-Time看起来像

X-Time:112

给定的值是响应处理的时间(以毫秒为单位)?有没有一种非常简单的方法将其添加到Grails应用程序?不是我想永久留下的东西,但在开发我的应用程序时会很高兴。

1 个答案:

答案 0 :(得分:32)

要简单地在回复中添加标题,您可以使用after过滤器。

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

修改

要实际计算时间,使用javax.servlet.Filter代替Grails过滤器可能更合适。

<强>的src /常规/ COM /示例/ 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 /模板/战/ web.xml中 (如果源树中不存在src / templates,则运行grails install-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的原因是您不必将“之前”和“之后”操作分开,因此可以保留整个过滤器链中的开始时间&amp; servlet执行。

补充说明:

对我来说,想要将服务器已用执行时间作为响应头返回似乎很奇怪。也许你有一个合理的理由这样做,但在大多数情况下我会A)要么更关心总往返时间(如客户所观察到的),要么B)记录服务器上经过的执行时间为我自己的系统管理/指标目的。