当前位置: 首页 > 知识库问答 >
问题:

在Grails 4中捕获用于日志记录的请求正文内容

袁弘化
2023-03-14

使用Grails 4构建一个新的API,我希望可以选择记录完整的请求(标头、方法、内容等)。我可以在Interceptor中看到请求,但是内容只能读取一次(使用HttpServletRequest.getInputStream()),所以在Interceptor中读取它会阻止内容在Controller中可用。

在堆栈溢出中已经有一些类似的问题,通过使用Grails过滤器来解决这个需求。

我不想走这条路的一个原因是,根据Grails文档,过滤器现在被认为是不建议使用的(从v3.0开始),应该使用拦截器。不幸的是,没有一个解决方案我可以找到工作与拦截器。我自己也尝试了一些这样的解决方案,包括将请求包装在一个HttpServletquiestWrapper中以缓存主体内容,并遇到了与其他人相同的问题,试图让它与拦截器一起工作。

我已经看到了使用JavaServlet过滤器的建议,这与Grails过滤器没有明显的区别,或者它们是否也应该避免。

编辑:如下面的评论所述,我没有提到我正在使用命令对象,解决方案需要使用这些对象。我还使用了其他一些Grails特性,我不确定这些特性是否会受到提出的任何解决方案的影响,因此,如果提出的解决方案存在局限性,最好了解这些局限性。

共有1个答案

缪茂勋
2023-03-14

新增PoC项目:https://github.com/majkelo/grails4requestinterceptor

基本上添加了一个拦截器PROJECT/grails app/controllers/testrequest/RequestModificatorInterceptor。groovy(修改所有请求):

package testrequest


class RequestModificatorInterceptor {

    RequestModificatorInterceptor() {
        match(controller: "*", action: "*")
    }

    boolean before() {
        println "INSIDE INTERCEPTOR; BEFORE"
        println request.properties
        println request.JSON
        request.JSON.before = "added"
        true
    }

    boolean after() {
        true
    }

    void afterView() {
    // no-op
    }
}

和test controllerPROJECT/grails app/controllers/testrequest/TestController。groovy

package testrequest

import grails.converters.JSON

class TestController {

    def index() {
        println "INSIDE CONTROLLER"
        println request.JSON
        request.JSON.incontroller = true
        render request.JSON as JSON
    }
}

它在控制器中的拦截器AND中读取/修改POST请求。示例请求:

curl --location --request POST 'http://localhost:8080/test' \
--header 'Content-Type: application/json' \
--data-raw '{"js":"on"}'```

 类似资料:
  • Webpack开发服务器代理配置留档: https://webpack.js.org/configuration/dev-server/#devserver-代理 表示它使用http代理中间件: https://github.com/chimurai/http-proxy-middleware#http-代理事件 使用上述链接中记录的功能,我可以执行以下操作: 我的问题是,尽管其他一切都很好——我

  • 我试图通过aop在控制器中记录超文本传输协议请求。但是,在方面代码中,如果我 那么请求数据将无法在主流中检索。 所以,我创建了另一个公共方法,在控制器中传递请求字符串 这种方法是记录“数据”的切入点。 但问题是,这种方法的切入点似乎无法通过Spring识别,这种方法没有日志记录。我需要帮助。 下面是aop的定义

  • 我正在使用在我的Android应用程序上发送HTTP POST请求。其中一个POST请求通过截击触发时返回。当通过rest客户端(Postman、curl)触发时,API返回。我怀疑通过截击发送的请求正文中有什么错误。 有没有办法记录volley在POST请求中发送的完整请求主体?我启用了,它确实记录了完整的响应,但它没有记录请求主体或URL。 请帮助我将HTTP请求的详细信息(url、请求正文等

  • 问题内容: 我正在使用PyDev进行Python应用程序的开发和单元测试。至于单元测试,除了没有内容记录到日志记录框架这一事实之外,一切都可以正常工作。记录器未被PyDev的“捕获的输出”捕获。 我已经将记录的所有内容转发到标准输出,如下所示: 但是,“捕获的输出”不会显示记录到记录器的内容。 这是一个示例unittest-script: test.py 控制台输出为: 但是该测试的“ 捕获输出

  • 看过本章第一节的同学应该还记得,log_by_lua* 是一个请求经历的最后阶段。由于记日志跟应答内容无关,Nginx 通常在结束请求之后才更新访问日志。由此可见,如果我们有日志输出的情况,最好统一到 log_by_lua* 阶段。如果我们把记日志的操作放在 content_by_lua* 阶段,那么将线性的增加请求处理时间。 在公司某个定制化项目中,Nginx 上的日志内容都要输送到 syslo