简体   繁体   English

如何在CXF拦截器中获取HTTP响应代码?

[英]How to get HTTP RESPONSE CODE in CXF interceptor?

I have web service based on Apache CXF. 我有基于Apache CXF的Web服务。 I wrote interceptor for logging some specific stuff that's included http response code. 我编写了拦截器,用于记录一些包含http响应代码的特定内容。

public class MyOutInterceptor extends AbstractPhaseInterceptor<Message> {

    public MyOutInterceptor() {
        super(Phase.SEND);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        Integer responseCode = (Integer) message.get(Message.RESPONSE_CODE);
        //...
    }
}

BUT!!! 但!!! responseCode is null . responseCodenull Even if I change the interceptor phase, it's always null . 即使更改了拦截器阶段,它也始终为null
How can I get http response code in CXF interceptor? 如何在CXF拦截器中获取http响应代码?


UPD . UPD Application Spring/CXF configuration: https://gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211 应用程序Spring / CXF配置: https : //gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211


UPD . UPD Temporary solution 临时解决方案

@Override
public void handleMessage(Message message) throws Fault {
    Integer responseCode = (Integer) message.get(Message.RESPONSE_CODE);
    if (null == responseCode) {
        HttpServletResponseWrapper responseWrapper = 
           (HttpServletResponseWrapper) message.get(AbstractHTTPDestination.HTTP_RESPONSE);
        responseCode = responseWrapper.getStatus();
    }
    //...
}

Make sure you've registered the interceptor for outinterceptor not for outFaultInterceptor or FaultInterceptor etc. Here is validated example. 确保已将拦截器注册为outinterceptor而不是outFaultInterceptor or FaultInterceptor等。这是经过验证的示例。

import org.apache.cxf.annotations.Provider;
import org.apache.cxf.annotations.Provider.Type;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Provider(value=Type.OutInterceptor)
public class KpOutInterceptor2 extends AbstractPhaseInterceptor<Message> {

    private final static Logger LOG = LoggerFactory.getLogger(KpOutInterceptor2.class);

    public KpOutInterceptor2() {
        super(Phase.SEND);

    }   

    @Override
    public void handleMessage(Message message) throws Fault {
        LOG.info("JAXRS response status code is {}", message.get(Message.RESPONSE_CODE));
    }

}

Or much better way use JAXRS 2.0 standard Filters. 或更好的方式使用JAXRS 2.0标准过滤器。

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Provider
public class KpOutInterceptor implements ContainerResponseFilter {

    private final static Logger LOG = LoggerFactory.getLogger(KpOutInterceptor.class);

    @Override
    public void filter(ContainerRequestContext reqCtx, ContainerResponseContext resCtx) throws IOException {

        LOG.info("JAXRS response status code is {}", resCtx.getStatus());

    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 当WebService返回代码403时,如何在CXF中获取HTTP响应主体? - How to get the HTTP response body in CXF when WebService returns code 403? 如何在 CXF Out Fault Interceptor 中将 HTTP STATUS 代码设置为 500 以外的值? - How to set the HTTP STATUS code to other than 500 in CXF Out Fault Interceptor? 如何在CXF拦截器中进行骆驼交换 - How to get camel exchange in cxf interceptor 如何从CXF输出获取拦截器的会话 - How to get session from cxf out interceptor 在Apache CXF Interceptor中编写消息内容和响应代码 - Write message content and response code in Apache CXF Interceptor 如何使用apache cxf获取http请求(soap)的有效负载。 使用拦截器时缺少信封闭合 - How to get payload of http request (soap) using apache cxf. Missing envelope closure while using interceptor Apache CXF:如何从拦截器返回失败响应 - Apache CXF: how to return failure response from an interceptor 获取响应状态代码可告知请求是否应在Spring MVC拦截器preHandle方法内使用HTTP 404进行响应 - get response status code tells if the request is supposed to responded with HTTP 404 inside a Spring MVC Interceptor preHandle method 如何从CXF请求拦截器中的SoapMessage获取WSDL操作名称 - How to get WSDL operation name from SoapMessage in CXF Request Interceptor 使用 CXF 拦截 HTTP 响应 - Intercept HTTP response with CXF
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM