2017-04-15 313 views
1

我试图获取wsdl操作名称(SOAPAction),但它给了我null。我已经写了一个骆驼蓝图中的请求拦截器。
做任务:目的是拦截Web服务请求,检索头名&密码的用户&检查是否有有权消耗请求的SOAPAction/OperationName。我怎样才能做到这一点。?有没有其他的方法来做到这一点。我的代码如何从CXF请求拦截器中的SoapMessage获取WSDL操作名称

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> 

回答

2

下面是解:)

@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 
0

请尝试以下代码:。。。。

//的SOAPMessage消息 字符串方法名= message.getExchange()getBindingOperationInfo()getOperationInfo()的getName()getLocalPart(); System.out.println(methodName);

+0

您正在给已经评论的行作为答案。 – Anmol