Java 使用拦截器记录REST服务,但可以';t日志请求和响应
我有一些REST服务,我想记录请求和响应。它们接收一个JSON请求并生成另一个JSON响应。我已经创建了一个拦截器,但无法获取请求/响应正文。这是我的cxf配置:Java 使用拦截器记录REST服务,但可以';t日志请求和响应,java,spring,logging,interceptor,Java,Spring,Logging,Interceptor,我有一些REST服务,我想记录请求和响应。它们接收一个JSON请求并生成另一个JSON响应。我已经创建了一个拦截器,但无法获取请求/响应正文。这是我的cxf配置: <bean id="ContextInInterceptor" class="main.interceptors.ContextMessageInInterceptor"></bean> <bean id="ContextOutInterceptor" class="main.interceptors.C
<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扩展了AbstractPhaseInterceptor{
@自动连线
ContextJSONInInterceptor ContextJSONInInterceptor;
public ContextMessageInInterceptor(){
超级(阶段前调用);
}
@凌驾
公共无效handleMessage(消息消息){
contextJSONInInterceptor.handleMessage(message);
}
}
公共类ContextJSONInInterceptor扩展了AbstractPhaseInterceptor{
公共上下文JSONiNinInterceptor(){
超级(阶段前调用);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
System.out.println(“内容类型:”+message.get(message.Content_-Type));
System.out.println(message.toString());
System.out.println(“--------------”;
}
}
公共类ContextMessageOutInterceptor扩展了AbstractPhaseInterceptor{
@自动连线
ContextJSONOutInterceptor ContextJSONOutInterceptor;
public contextmessageoutiterceptor(){
超级(相位写入);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
handleMessage(消息);
}
}
公共类ContextJSonOutinetCeptor扩展了AbstractPhaseInterceptor{
public ContextJSONOutInterceptor(){
超级(相位写入);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
System.out.println(“内容类型:“+消息内容类型”);
System.out.println(message.toString());
System.out.println(“--------------”;
}
}
ContextMessageInInterceptor和ContextMessageOutInterceptor工作正常,它们分别进入ContextJSONInInterceptor和ContextJSONOutInterceptor,但我不知道如何从这些拦截器获取请求/响应主体。我已经尝试使用“Message”常量,而内容类型就是我得到的全部
有人知道如何从那些拦截器获取请求/响应主体吗
非常感谢您的时间。与拦截器相比,AOP将是一个不错的选择。您可以将其应用于请求/响应流量通过的控制器方法。要在该请求范围内获取请求对象,您可以执行以下操作:
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
.getRequest();
您有两种选择:通过查看请求和方法,通过一些反思,您可以获得一些信息,这些信息可能就是您所需要的一切
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
}
}
第二种选择是(可以是互补的)。您可以使用指向所有
@RequestMapping()
注释的切入点,以及在您想要的时候执行的建议。不久前我就开始谈论这件事。太好了,但是,为什么这么有趣呢?因为我从来没有做过这样的事情,而且我觉得很有趣