java - 使用拦截器记录 REST 服务但无法记录请求和响应
问题描述
我有一些 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,但我不知道如何从这些拦截器获取请求/响应正文。我曾尝试使用“消息”常量,而内容类型就是我所得到的。
任何人都知道如何从这些拦截器获取请求/响应正文?
非常感谢您的时间。
解决方案
AOP 不是拦截器,而是一个不错的选择。您可以将其应用于请求/响应流量通过的控制器方法。为了在该请求范围内获取请求对象,您可以执行以下操作:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
推荐阅读
- sql - 获取 Oracle Sql 中链(树)中任何元素的最顶层元素
- css - 我想为每个奇数 p 元素设置样式,不包括隐藏的 p 元素
- javascript - 延迟加载适用于加载数据,但不适用于过滤
- java - 异常:用于保存实体的 org.hibernate.PersistentObjectException
- python - 有没有办法使用 BeatifulSoup 以编程方式编辑 html 文件中的嵌套表?
- php - how to sum up values of single dimentional array having same key in php
- c# - 为什么我们需要注册 IHttpClientFactory?
- facebook-graph-api - 我可以在不登录的情况下获取访问令牌吗?
- python - 在 Tkinter Python 程序中看不到图片
- snakemake - 尽管 conda 环境中存在包,但在蛇形管道中找不到命令错误