ReadSoapHeader将strPwdMd5传到BloodRecordDorinfoServiceOutImpl
Beans.xml配置如下<jaxws:endpoint id="dtoStudent" implementor="cn.myblood.reimburse.out.service.impl.DtoStudentServiceOutImpl" address="/DtoStudent">
<jaxws:inInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor" /><!-- 日志拦截 -->
            <bean class="cn.myblood.reimburse.filter.ReadSoapHeader" /><!-- 包头权限验证 -->
        </jaxws:inInterceptors>
</jaxws:endpoint>
ReadSoapHeader.java如下package cn.myblood.reimburse.filter;import javax.annotation.Resource;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.saaj.SAAJInInterceptor;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.NodeList;import cn.myblood.reimburse.model.PriviDefUserInfo;
import cn.myblood.reimburse.service.PriviDefUserInfoService;
import cn.myblood.reimburse.util.MD5;
import cn.myblood.reimburse.util.MySOAPException;public class ReadSoapHeader extends AbstractPhaseInterceptor<SoapMessage> {
@Resource(name="priviDefUserInfoService")
private PriviDefUserInfoService userInfoService;
private SAAJInInterceptor saa = new SAAJInInterceptor();
public ReadSoapHeader(){
// TODO Auto-generated constructor stub
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
} @Override
public void handleMessage(SoapMessage message) throws Fault {
// TODO Auto-generated method stub
SOAPMessage mess = message.getContent(SOAPMessage.class);
if (mess == null) {
saa.handleMessage(message);
mess = message.getContent(SOAPMessage.class);
}
SOAPHeader head = null;
try {
head = mess.getSOAPHeader();
} catch (SOAPException e) {
e.printStackTrace();
}
if (head == null) {
return;
}
NodeList spId = head.getElementsByTagName("userName");
NodeList spPassword = head.getElementsByTagName("password");
String strUserName = spId.item(0).getTextContent();
String strPasswordClient = spPassword.item(0).getTextContent();

PriviDefUserInfo uInfo = userInfoService.query(strUserName);
String strPasswordDb = uInfo.getPwd_new();
String strUser_id = uInfo.getUser_id();//获取用户User_ID;
String strPwdMd5 = MD5.compile(strPasswordClient+"_"+strUser_id);

if(!strPwdMd5.equals(strPasswordDb)){//判断是否验证成功
throw MySOAPException.getSOAPException("SVC0901", "鉴权失败,用户原因!!!");
}
}
}DtoStudentServiceOutImpl.java
package cn.myblood.reimburse.out.service.impl;import javax.jws.WebService;import cn.myblood.reimburse.out.service.DtoStudentServiceOut;
import cn.myblood.reimburse.util.Log4jUtil;
@WebService(targetNamespace="cn.myblood.reimburse")
public class DtoStudentServiceOutImpl implements DtoStudentServiceOut {
@Override
public int callDtoStudent(int id, int age, String name, int sendFlag) {
// TODO Auto-generated method stub
String strLog = "id:"+id+",age:"+age+",name:"+name+",sendFlag:"+sendFlag;//记录日志
Log4jUtil.forLog.info(strLog);


return id;
}
}

解决方案 »

  1.   

    怎样将ReadSoapHeader中的strPwdMd5传到BloodRecordDorinfoServiceOutImpl中,刚接触CXF,求解决。
      

  2.   

    package cn.myblood.reimburse.out.service.impl;import java.util.List;
    import java.util.Map;import javax.annotation.Resource;
    import javax.jws.WebService;
    import javax.xml.ws.WebServiceContext;import org.apache.cxf.headers.Header;
    import org.w3c.dom.Node;
    import org.w3c.dom.NodeList;import cn.myblood.reimburse.out.service.DtoStudentServiceOut;
    import cn.myblood.reimburse.util.Log4jUtil;
    @WebService(targetNamespace="cn.myblood.reimburse")
    public class DtoStudentServiceOutImpl implements DtoStudentServiceOut {
    @Resource
    private WebServiceContext context;
    @Override
    public int callDtoStudent(int id, int age, String name, int sendFlag) {
    // TODO Auto-generated method stub
    String strLog = "id:"+id+",age:"+age+",name:"+name+",sendFlag:"+sendFlag;//记录日志
    Log4jUtil.forLog.info(strLog);


    Map<String, Object> headers = context.getMessageContext();
    List<Header> headerList = (List<Header>) headers.get(Header.HEADER_LIST);

    for (Header header : headerList) {
    Node root = (Node) header.getObject();
    System.out.println("soap header name:" + root.getNodeName()+ " text:" + root.getTextContent());
    if ("RequestSOAPHeader".equals(root.getNodeName())) {
    NodeList list = root.getChildNodes();
    int size = list.getLength();
    for (int i = 0; i < size; i++) {
    Node node = list.item(i);
    System.out.println("soap header name:" + node.getNodeName()+ " text:" + node.getTextContent());
    }
    }
    }

    return id;
    }
    }