2009-11-12 4 views
0

WSS4J를 사용하여 이미 구성된 SOAP 요청 봉투의 머리글에 Username 토큰을 추가하고 있습니다. 합니다 (통지이미 생성 된 SOAP 봉투의 보안 헤더에 사용자 이름 토큰을 삽입하면 두 개의 헤더가 제공됩니다!

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
InputSource inStream = new InputSource(); 
inStream.setCharacterStream(new StringReader(request)); 
Document document = builder.parse(inStream); 

WSSecUsernameToken usernametoken = new WSSecUsernameToken(); 
usernametoken.setPasswordType(WSConstants.PASSWORD_TEXT); 
usernametoken.setUserInfo(username, password); 

WSSecHeader secHeader = new WSSecHeader("", false); 
secHeader.insertSecurityHeader(document); 
usernametoken.build(document, secHeader); 

이 내 결과입니다

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://sample03.samples.rampart.apache.org/xsd"> 
    <soapenv:Header/> 
    <soapenv:Body>  
     <xsd:echo>   
     <xsd:param0>hurro kitty</xsd:param0>  
     </xsd:echo> 
    </soapenv:Body></soapenv:Envelope> 

이 내 코드입니다 (문자열, 요청 위의 요청은,) : 여기

는 같은 SOAP 요청이 모습입니다 삽입 된 헤더는 정확하게 두 개의 헤더가 존재하는 것뿐만 아니라 두 개의 헤더가 존재한다.) :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://sample03.samples.rampart.apache.org/xsd"> 
    <Header>  
     <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">   
     <wsse:UsernameToken wsu:Id="UsernameToken-2765109" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">    
      <wsse:Username>bob</wsse:Username>    
      <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>   
     </wsse:UsernameToken>  
     </wsse:Security> 
    </Header> 
    <soapenv:Header/> 
    <soapenv:Body>  
     <xsd:echo>   
     <xsd:param0>hurro kitty</xsd:param0>  
     </xsd:echo> 
    </soapenv:Body></soapenv:Envelope> 

화 나는 틀린가?

답변

2

내가 뭘 잘못하고 있니?

초기 XML을 작성할 때 DocumentBuilderFactory가 네임 스페이스를 인식하는지 확인해야합니다. WSSecurity는 비누 네임 스페이스의 비누 헤더를 찾으려고하지만 사용할 수 없습니다. 다음 줄을 추가하면 문제가 해결됩니다.

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
factory.setNamespaceAware(true); 
...