使用拦截器记录 REST 服务但无法记录请求和响应
Using interceptor to log REST service but can't log request and response
我有一些 REST 服务,我想记录请求并且 response.They 收到一个 JSON 请求并生成另一个 JSON 响应。我创建了一个拦截器,但无法获取 request/response 正文。这是我的 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,但我不知道如何从这些拦截器中获取 request/reponse 正文.我尝试使用 "Message" 常量,我只得到内容类型。
有人知道如何从那些拦截器中获取 request/reponse 主体吗?
非常感谢您的宝贵时间。
AOP 比拦截器更好。您可以将它应用于您的控制器方法,其中 request/response 流量 passes.And 用于在该请求范围内获取请求对象,您可以执行以下操作:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
您有两个选择:使用 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 (which could be complementary). You could use a pointcut that would target all the @RequestMapping()
annotations, and an advice that would be executed in the exact moment you want to. I 不久前关于这个的。
我有一些 REST 服务,我想记录请求并且 response.They 收到一个 JSON 请求并生成另一个 JSON 响应。我创建了一个拦截器,但无法获取 request/response 正文。这是我的 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,但我不知道如何从这些拦截器中获取 request/reponse 正文.我尝试使用 "Message" 常量,我只得到内容类型。
有人知道如何从那些拦截器中获取 request/reponse 主体吗?
非常感谢您的宝贵时间。
AOP 比拦截器更好。您可以将它应用于您的控制器方法,其中 request/response 流量 passes.And 用于在该请求范围内获取请求对象,您可以执行以下操作:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
您有两个选择:使用 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 (which could be complementary). You could use a pointcut that would target all the @RequestMapping()
annotations, and an advice that would be executed in the exact moment you want to. I