【问题标题】:Grails - add header to every responseGrails - 为每个响应添加标题
【发布时间】:2021-03-18 06:15:26
【问题描述】:

如何添加响应标头 - 比如说 X-Time,它看起来像:

X-Time: 112

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

【问题讨论】:

  • 一个有用的应用是处理 X-UA-Compatible http-equiv 元标记,用于设置 IE 渲染器或 chromeframe 的版本,特别是 HTML5 样板项目。

标签: performance grails http-headers aop


【解决方案1】:

要简单地在响应中添加标头,您可以使用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)为我的服务器记录经过的执行时间自己的系统管理/指标目的。

【讨论】:

  • 我想这可以工作...我如何启动计时器?并结束它?我可以在前置过滤器中启动一个计时器,但是如何将该值传递给后置过滤器?到目前为止的好主意 +1
  • 我想我只是将您的问题解释为询问您将如何添加响应标头;让我为实际计时建立一个快速答案。
  • 看起来棒极了。谢谢。 +1 并回答。我只有一个系统,客户可以报告性能问题。它包括对来自客户端的完整请求/响应时间进行计时。但也包括服务器的实际“工作时间”/性能。
  • @tyndall - 一个可以理解的用例 :) - 很高兴它对你有用。
  • 请注意,如果您想添加一些不依赖于处理管道的标头(例如,不依赖于时间),那么您可以在闭包之前而不是在闭包之后(或在Servlet过滤器的预处理)。这样您就不会在已关闭的响应中遇到错误。
猜你喜欢
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
  • 2015-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
相关资源
最近更新 更多