簡體   English   中英

如何在CXF攔截器中獲取HTTP響應代碼?

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

我有基於Apache CXF的Web服務。 我編寫了攔截器,用於記錄一些包含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);
        //...
    }
}

但!!! responseCodenull 即使更改了攔截器階段,它也始終為null
如何在CXF攔截器中獲取http響應代碼?


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


UPD 臨時解決方案

@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();
    }
    //...
}

確保已將攔截器注冊為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));
    }

}

或更好的方式使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM