Web services 如何根据下面的web服务客户端迭代所有子元素SOAP头
基本上,我正在尝试按照下面的文章链接编写JAX-WS服务端代码 web服务客户端handleMessage中的代码(完整代码位于中)Web services 如何根据下面的web服务客户端迭代所有子元素SOAP头,web-services,soap-client,ws-security,soapheader,java-ws,Web Services,Soap Client,Ws Security,Soapheader,Java Ws,基本上,我正在尝试按照下面的文章链接编写JAX-WS服务端代码 web服务客户端handleMessage中的代码(完整代码位于中) SOAPElement usernameToken=security.addChildElement(“usernameToken”,“wsse”); usernameToken.addAttribute(新的QName(“xmlns:wsu”),”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-ws
SOAPElement usernameToken=security.addChildElement(“usernameToken”,“wsse”);
usernameToken.addAttribute(新的QName(“xmlns:wsu”),”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd");
SOAPElement用户名=usernameToken.addChildElement(“用户名”,“wsse”);
username.addTextNode(“TestUser”);
SOAPElement password=usernameToken.addChildElement(“密码”、“wsse”);
password.setAttribute(“类型”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText");
addTextNode(“TestPassword”)```
现在,如何为下面输入的soap xml编写相关的服务器端代码
测试用户
测试密码
我能够编写服务器端处理程序代码,用于验证OASIS、PFB handlerMessage(.)方法的WebService-Security头
输入XML
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:usernametoken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:username >TestUser</wsse:username>
<wsse:password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPassword</wsse:password>
</wsse:usernametoken>
</wsse:security>
</SOAP-ENV:Header>
<S:Body>
<ns2:getAreaDeatilsByPinCode xmlns:ns2="http://contract.webservice.room/">
<arg0>12</arg0>
</ns2:getAreaDeatilsByPinCode>
</S:Body>
</S:Envelope>
测试用户
测试密码
12
@覆盖
公共布尔handleMessage(SOAPMessageContext SOAPMessageContext){
//WS-Security-Publisher-OASIS,命名空间URI
最后一个字符串WSSE_NS_URI=”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
//带有标题元素的限定符
最终QName QName_WSSE_USERNAMETOKEN=新QName(WSSE_NS_URI,“USERNAMETOKEN”);
最终QName QName_WSSE_USERNAME=新QName(WSSE_NS_URI,“用户名”);
最终QName QName_WSSE_PASSWORD=新QName(WSSE_NS_URI,“密码”);
字符串wsseUsername=null;
字符串wssePassword=null;
System.out.println(“用于“+MessageContext.MESSAGE\u OUTBOUND\u属性的处理程序触发器”);
布尔值isRequest=(布尔值)soapMessageContext.get(MessageContext.MESSAGE\u出站\u属性);
如果(!isRequest){
试一试{
SOAPHeader header=soapMessageContext.getMessage().getSOAPHeader();
if(头==null){
header=soapMessageContext.getMessage().getSOAPPart().getEnvelope().addHeader();
GeneratesAperMessage(soapMessageContext.getMessage(),“无SOA头”);
}
//从SOAP头获取客户端数据
迭代器headerElements=header.CheckeallheaderElements();
while(headerElements.hasNext()){
SOAPHeaderElement headerElement=(SOAPHeaderElement)headerElements.next();
if(headerElement.getElementName().getLocalName().equals(“安全”)){
System.out.println(“内部安全”);
SOAPHeaderElement安全元素=headerElement;
迭代器securityChildern=securityElement.getChildElements();
while(securityChildern.hasNext()){
System.out.println(“内部安全文档”);
Node Node=(Node)securityChildern.next();
if(SOAPElement的节点实例){
System.out.println(“输入节点…”);
SOAPElement=(SOAPElement)节点;
QName elementQname=element.getElementQName();
if(QNAME_WSSE_USERNAMETOKEN.equals(elementQname)){
System.out.println(“验证用户名和密码…”);
SOAPElement usernameTokenElement=元素;
wsseUsername=getFirstChildElementValue(usernameTokenElement,QNAME\u WSSE\u USERNAME);
wssePassword=getFirstChildElementValue(usernameTokenElement,QNAME\u WSSE\u密码);
如果(!wsseUsername.equals(“TestUser”)| |!wssePassword.equals(“TestPassword”)){
生成密码消息(soapMessageContext.getMessage(),“用户名和密码错误…”);
}
System.out.println(“用户名:“+wsseUsername+”,密码:“+wssePassword”);
打破
}
}
}
if(wsseUsername!=null){
打破
}
}
}
}捕获(SOAPE例外){
e、 printStackTrace();
}
}
返回true;
}
私有字符串getFirstChildElementValue(SOAPElement用户名TokenElement、QName QName\u WSSE\u用户名){
System.out.println(“获取用户名和密码”);
字符串值=null;
迭代器usernameTokeChildren=usernameTokenElement.getChildElements(qNAME\u WSSE\u USERNAME);
while(usernameTokeChildren.hasNext()){
System.out.println(“获取用户名和密码的子元素”);
SOAPElement childElement=(SOAPElement)UsernameTokeChilderen.next();
value=childElement.getValue();
}
返回值;
}
private void GeneratesApperMessage(SOAPMessage消息,字符串原因){
试一试{
SOAPBody faultBody=message.getSOAPPart().getEnvelope().getBody();
SOAPFault SOAPFault=faultBody.addFault();
setFaultString(原因);
抛出新的SOAPFaultException(soapFault);
}捕获(SOAPE例外){
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Header>
<wsse:security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:usernametoken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:username >TestUser</wsse:username>
<wsse:password type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">TestPassword</wsse:password>
</wsse:usernametoken>
</wsse:security>
</SOAP-ENV:Header>
<S:Body>
<ns2:getAreaDeatilsByPinCode xmlns:ns2="http://contract.webservice.room/">
<arg0>12</arg0>
</ns2:getAreaDeatilsByPinCode>
</S:Body>
</S:Envelope>
@Override
public boolean handleMessage(SOAPMessageContext soapMessageContext) {
// WS-Security - Publisher - OASIS, Namespace URI
final String WSSE_NS_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
// Qualifier with header elements
final QName QNAME_WSSE_USERNAMETOKEN = new QName(WSSE_NS_URI, "usernametoken");
final QName QNAME_WSSE_USERNAME = new QName(WSSE_NS_URI, "username");
final QName QNAME_WSSE_PASSWORD = new QName(WSSE_NS_URI, "password");
String wsseUsername = null;
String wssePassword = null;
System.out.println("Handler trigger for " + MessageContext.MESSAGE_OUTBOUND_PROPERTY);
Boolean isRequest = (Boolean) soapMessageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (!isRequest) {
try {
SOAPHeader header = soapMessageContext.getMessage().getSOAPHeader();
if (header == null) {
header = soapMessageContext.getMessage().getSOAPPart().getEnvelope().addHeader();
generateSOAPErrMessage(soapMessageContext.getMessage(), "No SOA Header");
}
// Get client data from SOAP headers
Iterator<?> headerElements = header.examineAllHeaderElements();
while (headerElements.hasNext()) {
SOAPHeaderElement headerElement = (SOAPHeaderElement) headerElements.next();
if (headerElement.getElementName().getLocalName().equals("security")) {
System.out.println("inside security");
SOAPHeaderElement securityElement = headerElement;
Iterator<?> securityChildern = securityElement.getChildElements();
while (securityChildern.hasNext()) {
System.out.println("inside securityChildern");
Node node = (Node) securityChildern.next();
if (node instanceof SOAPElement) {
System.out.println("insdie node...");
SOAPElement element = (SOAPElement) node;
QName elementQname = element.getElementQName();
if (QNAME_WSSE_USERNAMETOKEN.equals(elementQname)) {
System.out.println("validating username and password...");
SOAPElement usernameTokenElement = element;
wsseUsername = getFirstChildElementValue(usernameTokenElement, QNAME_WSSE_USERNAME);
wssePassword = getFirstChildElementValue(usernameTokenElement, QNAME_WSSE_PASSWORD);
if(!wsseUsername.equals("TestUser") || !wssePassword.equals("TestPassword")){
generateSOAPErrMessage(soapMessageContext.getMessage(), "username and password are wrong....");
}
System.out.println("username::"+wsseUsername+ " , password::"+wssePassword);
break;
}
}
}
if (wsseUsername != null) {
break;
}
}
}
} catch (SOAPException e) {
e.printStackTrace();
}
}
return true;
}
private String getFirstChildElementValue(SOAPElement usernameTokenElement, QName qNAME_WSSE_USERNAME) {
System.out.println("get username and password");
String value = null;
Iterator<?> usernameTokenChilderen = usernameTokenElement.getChildElements(qNAME_WSSE_USERNAME);
while (usernameTokenChilderen.hasNext()) {
System.out.println("get the child elment for username and password");
SOAPElement childElement = (SOAPElement) usernameTokenChilderen.next();
value = childElement.getValue();
}
return value;
}
private void generateSOAPErrMessage(SOAPMessage message, String cause) {
try {
SOAPBody faultBody = message.getSOAPPart().getEnvelope().getBody();
SOAPFault soapFault = faultBody.addFault();
soapFault.setFaultString(cause);
throw new SOAPFaultException(soapFault);
} catch (SOAPException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getAreaDeatilsByPinCodeResponse xmlns:ns2="http://contract.webservice.room/">
<return>
<areaName>XXXXX</areaName>
<location>XXXXX</location>
<pincode>12</pincode>
<state>XX</state>
</return>
</ns2:getAreaDeatilsByPinCodeResponse>
</S:Body>
</S:Envelope>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope">
<faultcode>S:Server</faultcode>
<faultstring>username and password are wrong....</faultstring>
</S:Fault>
</S:Body>
</S:Envelope>