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

使用侦听器记录REST服务,但无法记录请求和响应

鲁辉
2023-03-14

我有一些REST服务,我想记录请求和响应。它们接收一个JSON请求并生成另一个JSON响应。我创建了一个拦截器,但无法获取请求/响应正文。这是我的cxf配置:

<bean id="ContextInInterceptor" class="main.interceptors.ContextMessageInInterceptor"></bean>
<bean id="ContextOutInterceptor" class="main.interceptors.ContextMessageOutInterceptor"></bean>
<bean id="ContextJSONInInterceptor" class="main.interceptors.ContextJSONInInterceptor"></bean>
<bean id="ContextJSONOutInterceptor" class="main.interceptors.ContextJSONOutInterceptor"></bean>

<cxf:bus>
   <cxf:features>
      <cxf:logging/>
   </cxf:features>

   <cxf:inInterceptors>
      <ref bean="ContextInInterceptor"/>
   </cxf:inInterceptors>
   <cxf:outInterceptors>
      <ref bean="ContextOutInterceptor"/>
   </cxf:outInterceptors>
</cxf:bus>

这是我的拦截器代码

public class ContextMessageInInterceptor extends AbstractPhaseInterceptor<org.apache.cxf.message.Message> {

       @Autowired
       ContextJSONInInterceptor contextJSONInInterceptor;

       public ContextMessageInInterceptor() {
           super(Phase.PRE_INVOKE);
       }

       @Override
       public void handleMessage(Message message) {
           contextJSONInInterceptor.handleMessage(message);
       }
}

public class ContextJSONInInterceptor extends AbstractPhaseInterceptor<Message> {

    public ContextJSONInInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + message.get(Message.CONTENT_TYPE));
        System.out.println(message.toString());
        System.out.println("---------------");
    }
}

public class ContextMessageOutInterceptor extends AbstractPhaseInterceptor<Message> {

    @Autowired
    ContextJSONOutInterceptor contextJSONOutInterceptor;

    public ContextMessageOutInterceptor() {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        contextJSONOutInterceptor.handleMessage(message);
    }
}

public class ContextJSONOutInterceptor extends AbstractPhaseInterceptor<Message> {

    public ContextJSONOutInterceptor() {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + Message.CONTENT_TYPE);
        System.out.println(message.toString());
        System.out.println("---------------");
    }

}

ContextMessageInInterceptor和ContextMessageOutInterceptor工作正常,它们分别转到ContextJSONInInterceptor和ContextJSONOutInterceptor,但我不知道如何从这些拦截器获取请求/响应正文。我尝试使用“消息”常量,我只得到内容类型。

有人知道如何从这些拦截器中获取请求/响应正文吗?

非常感谢你的时间。

共有2个答案

后安民
2023-03-14

您有两种选择:使用HandlerInterceptor,您可以查看请求和方法,通过一些反射,您可以获得一些信息,这些信息可能就是您所需要的一切。

public class ApiInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // code
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//code
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
   // code
    }
}

第二种选择是Spring AOP(可以是互补的)。您可以使用一个切入点,该切入点将针对所有的RequestMapping()注释,以及一个建议,该建议将在您想要的时候执行。不久前,我问了(并回答了)一个关于这方面的问题。

邓季
2023-03-14

AOP将是一个不错的选择,而不是拦截器。您可以在请求/响应流量通过的控制器方法上应用它。要获取该请求范围中的请求对象,可以执行以下操作:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
            .getRequest();
 类似资料:
  • 我有一个spring应用程序,它可以与Mobile交换JSON。Spring控制器如下所示: 我想知道,记录http请求正文和响应正文的最佳方式是什么?目前,我有一个定制的json消息转换器,它在从json中创建bean之前记录一个请求正文。我使用CustomTraceInterceptor记录响应正文。不幸的是,CustomTraceInterceptor不允许记录请求正文。 任何更好的解决方案

  • 问题内容: 我想记录一个axis2客户端发出的所有请求/响应。我试图在http://code.google.com/support/bin/answer.py?hl=zh_CN&answer=15137中创建一个称为describer 的文件,但没有成功(我没有日志文件)。 请求是通过https发出的,我不确定是否重要。我试过了 和 没有成功。 问题答案: 对于SOAP消息的Axis2客户端日志记

  • 问题内容: 我想将所有传入和传出请求记录到一个特定的日志文件中。但是,我通过以下配置获得的只是控制台输出。怎么了 log4j2.xml: src / main / resources / META-INF / cxf / org.apache.cxf.Logger: 问题答案: 解决方法是,我现在使用和桥依赖。

  • 我只收到请求,没有回应。

  • 问题内容: 出于调试目的,我想使用Django的日志记录机制来记录每个传入的请求,当它们到达django-rest-framework的家门口时。 Djagno以以下方式(来自settings.py的“ LOGGING”部分)提供其请求的日志记录(仅“警告”日志级别和更高级别): 我正在寻求实现以下目标(注意:日志级别为DEBUG): 有没有办法在不将记录器嵌入DRF的源代码的情况下做到这一点?

  • 我在改型API中找不到记录完整请求/响应体的相关方法。我希望在探查器中得到一些帮助(但它只提供关于响应的元数据)。我尝试在构建器中设置日志级别,但这也没有帮助: 编辑:此代码正在工作。我不知道为什么它在早些时候不起作用。可能是因为我用的是旧版本的改装。