繁体   English   中英

如何从CXF请求拦截器中的SoapMessage获取WSDL操作名称

[英]How to get WSDL operation name from SoapMessage in CXF Request Interceptor

我试图获取wsdl操作名称(SOAPAction),但它给了我null。 我在驼峰蓝图中写了一个请求拦截器。
任务:目的是拦截web服务请求从头部检索用户名和密码,并检查用户是否有权使用请求的SOAPAction / OperationName。 我怎样才能做到这一点。 有没有其他方法来做到这一点。

public class Interceptor extends AbstractSoapInterceptor {

    Logger _log = Logger.getLogger(Interceptor.class);

    public Interceptor() {
        super(Phase.PRE_LOGICAL);
    }

    @Override
    public void handleMessage(SoapMessage message) {
        _log.info(".... IM HERE INTERCEPTOR");

        Map<String, List<String>> headers = CastUtils.cast((Map) message.get(Message.PROTOCOL_HEADERS));
        _log.info(".... IM HERE INTERCEPTOR:::: " + headers.size());

        for (Entry<String, List<String>> entry : headers.entrySet()) {
            _log.info(entry.getKey() + " /// " + entry.getValue().get(0));
        }
    }
}

我的代码日志在这里:

.... IM HERE INTERCEPTOR
.... IM HERE INTERCEPTOR:::: 9
accept-encoding /// gzip,deflate
connection /// keep-alive
Content-Length /// 351
content-type /// text/xml;charset=UTF-8
Host /// localhost:8181
password /// herman
SOAPAction /// ""
User-Agent /// Apache-HttpClient/4.1.1 (java 1.5)
username /// herman

下面是蓝图

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
    xmlns:camel="http://camel.apache.org/schema/blueprint"
    xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
    xmlns:cxf="http://camel.apache.org/schema/blueprint/cxf"
    xmlns:cxfcore="http://cxf.apache.org/blueprint/core"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="              http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd              http://camel.apache.org/schema/blueprint/cxf http://camel.apache.org/schema/blueprint/cxf/camel-cxf.xsd              http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd              http://cxf.apache.org/schemas/blueprint/core http://cxf.apache.org/schemas/blueprint/core.xsd              http://cxf.apache.org/blueprint/jaxws http://cxf.apache.org/blueprint/jaxws.xsd">
    <bean class="pk.com.herman.log.query.QueryProcessor" id="QueryProcessor"/>
    <bean class="pk.com.herman.get.query.QueryGetProcessor" id="QueryGetProcessor"/>
    <bean class="pk.com.herman.interceptors.Interceptor" id="requestInterceptor"/>
    <cxfcore:bus bus="cxf">
        <cxfcore:inInterceptors>
            <ref component-id="requestInterceptor"/>
        </cxfcore:inInterceptors>
    </cxfcore:bus>
    <cxf:cxfEndpoint address="/query/" id="queryEndpoint" serviceClass="pk.com.herman.log.query.QueryService"/>
    <camelContext id="camelContext-282c3eaf-a6ba-4f22-bee7-9ad3fd7ae3ca" xmlns="http://camel.apache.org/schema/blueprint">
        <route id="cxf">
            <!-- route starts from the cxf webservice in POJO mode -->
            <from id="_from1" uri="cxf:bean:queryEndpoint"/>
            <recipientList id="_recipientList1">
                <simple>direct:${header.operationName}</simple>
            </recipientList>
        </route>
        <route id="query">
            <from id="_from2" uri="direct:reportQuery"/>
            <log id="_log1" message="Query Call"/>
            <process id="_process1" ref="QueryProcessor"/>
            <to id="_to1" uri="log:output"/>
        </route>
    </camelContext>
</blueprint>

这是解决方案:)

@Override
public void handleMessage(SoapMessage message) {
    _log.info(".... IM HERE INTERCEPTOR");

    HttpServletRequest httpRequest = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);

    Message inMessage = message.getExchange().getInMessage();
    MessageInfo mi = (MessageInfo) inMessage.get(MessageInfo.class);
    OperationInfo operationInfo = mi.getOperation();

    _log.info("username:: " + httpRequest.getHeader("username"));
    _log.info("password:: " + httpRequest.getHeader("password"));

    if (operationInfo != null) {
        _log.info("operationInfo:: " + operationInfo.getInputName());
    }
}

日志:

username:: herman
password:: herman
operationInfo:: getQuery

请尝试以下代码:

// SoapMessage消息String methodName = message.getExchange()。getBindingOperationInfo()。getOperationInfo()。getName()。getLocalPart(); 的System.out.println(方法名);

暂无
暂无

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM