请问如何用cxf在请求中加header信息

228 views
Skip to first unread message

limaoyuan00

unread,
Jun 4, 2008, 10:49:10 PM6/4/08
to cxf-zh
最近要做一个webservice接口,并且要有一定的安全性,在网上查资料说可以通过往soap的header中加username和
password节点,然后在服务器端去获取username和password,以此来判断请求是否合法。

现在我想知道在
1.cxf中服务器端是如何来得到soap:header中的内容的?
2.cxf客户端是如何往添加header信息的。

最好给个例子
谢谢!

Freeman Fang

unread,
Jun 4, 2008, 11:01:46 PM6/4/08
to cxf...@googlegroups.com

http://cxf.apache.org/faq.html#FAQ-HowcanIaddsoapheaderstotherequest%252Fresponse%253F
还有你到cxf英文的邮件列表里面搜一下 "basic auth", 有不少相关内容

Freeman

罗光林

unread,
Jun 5, 2008, 1:34:37 AM6/5/08
to cxf...@googlegroups.com


> Date: Wed, 4 Jun 2008 19:49:10 -0700
> Subject: [cxf-zh] 请问如何用cxf在请求中加header信息
> From: limaoy...@hotmail.com
> To: cxf...@googlegroups.com

guanglin

unread,
Jun 5, 2008, 1:38:39 AM6/5/08
to cxf-zh

你可以参考http://pki-gavin.javaeye.com/blog/173742的做法
On 6月5日, 下午1时34分, 罗光林 <guanglin_...@hotmail.com> wrote:
> > Date: Wed, 4 Jun 2008 19:49:10 -0700> Subject: [cxf-zh] 请问如何用cxf在请求中加header信息> From: limaoyuan0...@hotmail.com> To: cxf...@googlegroups.com> > 最近要做一个webservice接口,并且要有一定的安全性,在网上查资料说可以通过往soap的header中加username和> password节点,然后在服务器端去获取username和password,以此来判断请求是否合法。> > 现在我想知道在> 1.cxf中服务器端是如何来得到soap:header中的内容的?> 2.cxf客户端是如何往添加header信息的。> > 最好给个例子> 谢谢!> > > _________________________________________________________________
>
> 多个邮箱同步管理,live mail客户端万人抢用中http://get.live.cn/product/mail.html

melin

unread,
Jun 5, 2008, 5:01:53 AM6/5/08
to cxf-zh
往SOAPHeader中添加就可以了
实例

Service service = Service.create(SERVICE_NAME);
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
endpointAddress);

Dispatch<SOAPMessage> dispatch =
service.createDispatch(PORT_NAME, SOAPMessage.class,
Service.Mode.MESSAGE);

// Use Dispatch as BindingProvider
BindingProvider bp = (BindingProvider) dispatch;

// Optionally Configure RequestContext to send SOAPAction HTTP
Header
Map<String, Object> rc = bp.getRequestContext();
//SOAPAction 的标准属性。此 boolean 属性指示是否使用 SOAPAction。此属性的默认值为 false,指示
不使用 SOAPAction。
rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
//javax.xml.ws.soap.http.soapaction.use 属性设置为 true,则指示 SOAPAction
URI
rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, "melin");

//Obtain a preconfigured SAAJ MessageFactory
MessageFactory factory = ((SOAPBinding)
bp.getBinding()).getMessageFactory();
// Create SOAPMessage Request
SOAPMessage request = factory.createMessage();
// Request Header
SOAPHeader header = request.getSOAPHeader();
// Request Body
SOAPBody body = request.getSOAPBody();
QName payloadName = new QName("http://java2ws.cxf.starit.com/",
"sayHello", "ns1");
SOAPBodyElement payload = body.addBodyElement(payloadName);
SOAPElement message = payload.addChildElement("msg");
message.addTextNode("Hello World!");

SOAPMessage reply = null;
try {
reply = dispatch.invoke(request);
} catch (WebServiceException wse){
wse.printStackTrace();
}

body = reply.getSOAPBody();
QName responseName = new QName("http://java2ws.cxf.starit.com/",
"sayHelloResponse");
SOAPBodyElement bodyElement = (SOAPBodyElement)
body.getChildElements(responseName).next();
String msg = bodyElement.getValue();

limaoyuan00

unread,
Jun 5, 2008, 6:00:14 AM6/5/08
to cxf-zh
感谢各位的回答,我现在就看看大家提供的方法,多谢!

limaoyuan00

unread,
Jun 5, 2008, 11:37:08 PM6/5/08
to cxf-zh
你好,我按你说的那个贴子方法做了一下,结果会出现下面的异常,上网搜了办法也没找到解决的办法,去看了这篇贴子也没什么收获http://
cwiki.apache.org/confluence/display/CXF20DOC/WS-Security

抛出了下面的异常,是不是有什么冲突?
信息: Creating Service {http://demo.com/}HelloWorldService from class
com.demo.HelloWorld
context:
org.springframework.context.support.ClassPathXmlApplicationContext@1ffb8dc:
display name
[org.springframework.context.support.ClassPathXmlApplicationContext@1ffb8dc];
startup date [Fri Jun 06 02:11:04 GMT 2008]; root of context
hierarchy
2008-6-6 2:11:26 org.apache.cxf.phase.PhaseInterceptorChain
doIntercept
信息: Interceptor has thrown exception, unwinding now
org.apache.cxf.binding.soap.SoapFault: SOAPEXCEPTION
at
org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:
83)
at
org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:
57)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:
73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:
177)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)
Caused by: javax.xml.soap.SOAPException: Failed to create
MessageFactory: org.apache.axis.soap.MessageFactoryImpl
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:55)
at
org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor.handleMessage(SAAJOutInterceptor.java:
71)
... 8 more
Caused by: java.lang.ClassNotFoundException:
org.apache.axis.soap.MessageFactoryImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:50)
... 9 more
Exception in thread "main" javax.xml.ws.WebServiceException: Cannot
create SAAJ factory instance.
at
org.apache.cxf.jaxws.binding.soap.SOAPBindingImpl.getSOAPFactory(SOAPBindingImpl.java:
118)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:
193)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)
Caused by: javax.xml.soap.SOAPException: Failed to create
SOAPConnectionFactory: org.apache.axis.soap.SOAPFactoryImpl
at javax.xml.soap.SOAPFactory.newInstance(SOAPFactory.java:46)
at
org.apache.cxf.jaxws.binding.soap.SOAPBindingImpl.getSOAPFactory(SOAPBindingImpl.java:
113)
... 3 more
Caused by: java.lang.ClassNotFoundException:
org.apache.axis.soap.SOAPFactoryImpl
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at javax.xml.soap.SOAPFactory.newInstance(SOAPFactory.java:41)
... 4 more






如果添加了axis包后会抛下面异常:
2008-6-6 2:07:55 org.apache.cxf.phase.PhaseInterceptorChain
doIntercept
信息: Interceptor has thrown exception, unwinding now
org.w3c.dom.DOMException: No such Localname for SOAP URI
at
org.apache.axis.message.SOAPDocumentImpl.createElementNS(SOAPDocumentImpl.java:
379)
at org.apache.axis.SOAPPart.createElementNS(SOAPPart.java:1109)
at
org.apache.cxf.staxutils.W3CDOMStreamWriter.writeStartElement(W3CDOMStreamWriter.java:
98)
at
org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.writeSoapEnvelopeStart(SoapOutInterceptor.java:
95)
at
org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:
76)
at
org.apache.cxf.binding.soap.interceptor.SoapOutInterceptor.handleMessage(SoapOutInterceptor.java:
57)
at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:
221)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:276)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:222)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:
73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:
177)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)
Exception in thread "main" java.lang.NoSuchMethodError:
javax.xml.soap.SOAPFactory.createFault()Ljavax/xml/soap/SOAPFault;
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:
193)
at $Proxy16.sayHi(Unknown Source)
at com.demo.Client.main(Client.java:14)


期待你的回复再次感谢


willem

unread,
Jun 9, 2008, 12:43:13 AM6/9/08
to cxf-zh
这应该是一个老问题了,在CXF中只能使用SUN 的SAAJ 实现,目前使用的版本是1.3 。
相关的jar 你可以在CXF的发行包里面的lib 中找到。

从你的stack trace 中看到的错误是CXF 尝试创建Axis 的SAAJ实现出现错误了。
要解决这个问题就是保证sun的saaj 实现jar 在CXF 中能被加载。

姜宁 (Willem)
--------------------------------
http://willem.bokeland.com
http://www.ohloh.net/accounts/4473

melin

unread,
Aug 3, 2008, 4:11:46 AM8/3/08
to cxf-zh
public class LoggingInterceptor extends
AbstractPhaseInterceptor<SoapMessage> {
Log logger = LogFactory.getLog(LoggingInterceptor.class);

private SAAJInInterceptor saajIn = new SAAJInInterceptor();

public LoggingInterceptor() {
super(Phase.PRE_PROTOCOL);
getAfter().add(SAAJInInterceptor.class.getName());
}

public void handleMessage(SoapMessage message) throws Fault {
try {
logger.info("记录访问web services日志");
SOAPMessage doc = message.getContent(SOAPMessage.class);
if (doc == null) {
saajIn.handleMessage(message);
doc = message.getContent(SOAPMessage.class);
}
SOAPHeader header = doc.getSOAPHeader();
if (header == null) {
return;
}

NodeList nodes = header.getElementsByTagName("proc:user");
for(int i=0; i<nodes.getLength(); i++) {
System.out.println(nodes.item(i).getLocalName()
+"----"+nodes.item(i).getTextContent());
}

} catch (SOAPException e) {
e.printStackTrace();
}

}
}

melin

unread,
Aug 3, 2008, 4:17:57 AM8/3/08
to cxf-zh
上面测试SOAP消息:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/
envelope/" xmlns:wsdl="http://starit.com/wsdl">
<soapenv: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-7417577"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-
wssecurity-utility-1.0.xsd">
<wsse:Username>melin</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/
2004/01/oasis-200401-wss-username-token-
profile-1.0#PasswordDigest">viRsQK89kqsy+LXiqMZk4vrk1i0=</
wsse:Password>
<wsse:Nonce>nHqayWsD8Xia3OZ11L+aHw==</wsse:Nonce>
<wsu:Created>2008-08-03T04:40:19.140Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
<proc:processed-by soapenv:mustUnderstand="1" xmlns:proc="http://
www.javaeye.com/">
<proc:node><proc:user>melin</proc:user></proc:node>
</proc:processed-by>
</soapenv:Header>
<soapenv:Body>
<wsdl:DoubleIt>
<numberToDouble>10</numberToDouble>
</wsdl:DoubleIt>
</soapenv:Body>
</soapenv:Envelope>
Reply all
Reply to author
Forward
0 new messages