Grails - 为每个响应添加标头

Bud*_*Joe 8 performance grails aop http-headers

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

X-Time:112

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

Rob*_*ska 32

要简单地向响应添加标头,您可以使用after过滤器.

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

编辑:

要实际计算时间,使用javax.servlet.FilterGrails过滤器代替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() { }
}
Run Code Online (Sandbox Code Playgroud)

src/templates/war/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>
Run Code Online (Sandbox Code Playgroud)

使用它的原因javax.servlet.Filter是,您不必将"之前"和"之后"操作分开,因此可以保留整个过滤器链和servlet执行的开始时间.

补充说明:

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

  • 我想我只是将你的问题解释为询问如何添加响应头; 让我建立一个快速的答案,实际计时. (2认同)