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

在play框架中使用过滤器和动作获取请求主体

牟星火
2023-03-14

在play framework Java中找不到传入请求的请求体。我需要在play framework API中记录所有传入请求。为此,我尝试使用滤镜和动作组合。但我能得到请求体。

我尝试使用滤镜和动作组合。

public class LoggingFilter extends EssentialFilter {

    private final Executor executor;

    @Inject
    public LoggingFilter(Executor executor) {
        super();
        this.executor = executor;
    }

    @Override
    public EssentialAction apply(EssentialAction next) {
        return EssentialAction.of(request -> {
            long startTime = System.currentTimeMillis();

            Accumulator<ByteString, Result> accumulator = next.apply(request);

            System.out.println(request);
            return accumulator.map(result -> {
                long endTime = System.currentTimeMillis();
                long requestTime = endTime - startTime;


                Logger.info("{} {} took {}ms and returned {}",
                        request.method(), request.uri(), requestTime, result.status());

                return result.withHeader("Request-Time", "" + requestTime);
            }, executor);
        });
    }
}

从这个请求中,我可以得到body是否存在的布尔值。但却无法得到真正的尸体。

共有1个答案

上官德寿
2023-03-14

您可以在action Composition中获取请求正文并记录它:

import play.Logger;
import play.mvc.Http;
import play.mvc.Result;

import java.util.concurrent.CompletionStage;

public class ClientLogger extends play.mvc.Action.Simple {

    public CompletionStage<Result> call(Http.Context context) {
        StringBuffer logMessage = new StringBuffer();
        logMessage.append(context.request().toString())
                .append("\n")
                .append("body json: " + context.request().body().asJson().toString());
        Logger.info(logMessage.toString());
        return delegate.call(context);
    }
}
 类似资料:
  • 如果有人能抛出关于如何修改以下播放框架日志过滤器(ref.play filters)以实现以下目标的指针,我将不胜感激: null

  • 在我的Play(Java)框架项目中,我正在使用Guice进行依赖项注入,并且正在努力理解如何最好地将“会话”的概念与Guice和Play结合使用? 我知道Play是无状态的,除了可以在cookie中存储值之外,实际上没有会话的概念。我对Guice和Play的理解是,虽然Guice文档描述了支持不同的作用域(单例、会话、请求、无作用域),但因为我们正在用每个请求实例化一个新的注入器,所以仅适用于P

  • 我想通过Spring过滤器或方面记录超文本传输协议请求中的请求参数。我尝试了不同的方法,但请求参数为空或未调用方法。我使用的是POSTMAN,它是一个POST请求。 http://localhost:8080/available data 请求正文示例: {“keyUserAgent”:“CFNetwork/1209 Darwin/20.2.0”,“locale”:“en_US”,“eid”:“8

  • 我正在使用Django3.1.7和指南:指南我正在尝试做下拉式dinamic查询,我不知道是否有一个更好的形式来做这件事...没有必要使用Django Rest框架,我可以自由使用我想要的所有东西。

  • 我试图在spring boot应用程序中配置的过滤器中获取请求中的Traceid以进行审计。 我们如何从过滤器中的请求中获取Traceid

  • 为了解决这一限制, 从发布AEM实例启动的工作流:当从AEM发布实例提交自适应表单、交互式通信或信件时,所有工作流实例都使用服务用户创建。在这些情况下,工作流实例数据中不会捕获登录用户的用户名。 我添加了一个过滤器servlet来拦截AEM Forms servlet之前的初始表单提交,使用请求包装器修改请求正文,添加原始用户ID。 我审查了以下资源: 如何在java过滤器中更改servlet请求