要简单地在响应中添加标头,您可以使用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
(如果 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 的原因是您不必分离“之前”和“之后”操作,因此可以在整个过滤器链和 servlet 执行过程中保持开始时间。
补充说明:
对我来说,想要将服务器经过的执行时间作为响应标头返回似乎很奇怪。也许您有这样做的正当理由,但在大多数情况下,我会 A)更关心总往返时间(由客户端观察到),或者 B)为我的服务器记录经过的执行时间自己的系统管理/指标目的。