cxf webservice服务端怎么能获取cxf soap客户端生成发送的soap请求信息

博客分类:
CXF服务端代码:
1、web.xml配置
&?xml version="1.0" encoding="UTF-8"?&
&web-app version="2.5" xmlns="/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="/xml/ns/javaee
/xml/ns/javaee/web-app_2_5.xsd"&
&!-- Spring Config Location --&
&context-param&
&param-name&contextConfigLocation&/param-name&
&param-value&/WEB-INF/beans.xml&/param-value&
&/context-param&
&!-- Spring ContextLoaderListener --&
&listener&
&listener-class&
org.springframework.web.context.ContextLoaderListener
&/listener-class&
&/listener&
&!-- Apache CXFServlet --&
&servlet-name&CXFServlet&/servlet-name&
&servlet-class&
org.apache.cxf.transport.servlet.CXFServlet
&/servlet-class&
&load-on-startup&1&/load-on-startup&
&/servlet&
&!-- CXFServlet Mapping --&
&servlet-mapping&
&servlet-name&CXFServlet&/servlet-name&
&url-pattern&/service/*&/url-pattern&
&/servlet-mapping&
&/web-app&
2、beans.xml配置, 在beans.xml中配置服务端的拦截器interceptor.AuthenticationInterceptor,拦截器需要
继承AbstractPhaseInterceptor
&beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd"&
&!-- Import Apache CXF Bean Definition --&
&import resource="classpath:META-INF/cxf/cxf.xml" /&
&import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /&
&import resource="classpath:META-INF/cxf/cxf-servlet.xml" /&
&!-- serviceClass指定接口 --&
&jaxws:server id="hello"
serviceClass="service.SampleWebService"
address="/HelloWorld"&
&jaxws:serviceBean&
&bean class="service.SampleWebService" /&
&/jaxws:serviceBean&
&jaxws:inInterceptors&
&bean class="interceptor.AuthenticationInterceptor"&
&property name="username" value="admin" /&
&property name="password" value="admin" /&
&/jaxws:inInterceptors&
&/jaxws:server&
3、在拦截器中对用户身份进行验证
import java.util.L
import javax.xml.soap.SOAPE
import org.apache.cxf.binding.soap.SoapM
import org.apache.cxf.headers.H
import org.apache.cxf.interceptor.F
import org.apache.cxf.phase.AbstractPhaseI
import org.apache.cxf.phase.P
import org.w3c.dom.N
public class AuthenticationInterceptor extends AbstractPhaseInterceptor&SoapMessage& {
public AuthenticationInterceptor() {
// 指定该拦截器在哪个阶段被激发
super(Phase.PRE_INVOKE);
public void handleMessage(SoapMessage msg) throws Fault {
List&Header& headers = msg.getHeaders();
if (null == headers || headers.size() & 1) {
throw new Fault(new SOAPException("SOAPHeader格式错误"));
for (Header header : headers) {
Node root = (Node) header.getObject();
if("Authentication".equals(root.getNodeName())){
Node userNode = root.getFirstChild();
Node passwordNode = root.getLastChild();
if(userNode == null || passwordNode == null){
throw new Fault(new SOAPException("SOAPHeader需要包含Username和Password节点"));
if(!userNode.getNodeName().equals("Username") || !passwordNode.getNodeName().equals("Password")){
throw new Fault(new SOAPException("SOAPHeader需要包含Username和Password节点"));
if(username.equals(userNode.getTextContent()) && password.equals(passwordNode.getTextContent())){
System.out.println("认证通过");
throw new Fault(new SOAPException("用户名或密码错误"));
throw new Fault(new SOAPException("SOAPHeader需要包含Authentication节点"));
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPassword() {
public void setPassword(String password) {
this.password =
4、服务接口,CXF可以直接发布JavaBean,只需要一个@WebService注解
import javax.jws.WebS
@WebService
public class SampleWebService{
public String sayHello(String name) {
return "Hello, "+
public String sayHi(String name) {
return "Hi, "+
5、Axis客户端:
* &soapenv:Header&
&Authentication
soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next"
soapenv:mustUnderstand="0"
&Username&admin&/Username&
&Password&admin&/Password&
&/Authentication&
* &/soapenv:Header&
* @param user
* @param password
public static void authentication(String user, String password){
Call call = (Call)new Service().createCall();
call.setTargetEndpointAddress("http://localhost:8080/ws/service/HelloWorld");
String namespace = "";//命名空间
SOAPHeaderElement header = new SOAPHeaderElement(namespace,"Authentication");
header.setPrefix("");//前缀
header.addChildElement("Username").addTextNode(user);
header.addChildElement("Password").addTextNode(password);
call.addHeader(header);
Object obj = call.invoke("sayHi", new String[]{"sam"});
System.out.println(obj);
} catch (Exception e) {
e.printStackTrace();
在axis的jar包中还提供了一个tcp_moniter,可以用来拦截soap消息,便于debug。
可以使用java -Djava.ext.dirs=lib org.apache.axis.utils.tcpmon来启动,启动前要先将axis的jar包都放在lib目录下,然后在lib的同级目录中建一个bat脚本,脚本中写:java -Djava.ext.dirs=lib org.apache.axis.utils.tcpmon。
这样双击bat脚本就可以启动tcp_moniter了。
tcp_moniter界面:
cxf_server端和axis_client端的工程源码见附件。
下载次数: 109
下载次数: 71
下载次数: 57
浏览: 158186 次
来自: 哈尔滨
提示An error was discovered proce ...
学习了。不太接触底层的东西
加油,。。。
莫非去淘宝菜鸟网络了?
我也是哈尔滨的,在广州做了三年的开发,可是实际上我们是在维护一 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'其他回答(6)
直接使用系统生成的不可以吗?
你的这个需求也曾想过,毕竟自动的soap有点复杂,但我从没去实践过。
给你个建议:从attribute着手,应该是一个解决方案。
收获园豆:20
园豆:5714
园豆:5714
确认一下,是请求报文,还是你的WebService返回的报文?
收获园豆:20
园豆:34865
园豆:34865
园豆:34865
没写过自定义格式的,长知识了。
收获园豆:10
园豆:2539
已经解决,解决方法如下。
1.首先使用字符串拼接出来自定义的返回报文格式data。
2.使用如下方法输出
Context.Response.ContentEncoding = System.Text.Encoding.UTF8;Context.Response.ContentType = "text/xml";Context.Response.Write(data);Context.Response.Flush();Context.Response.End();
楼主,请问你这个问题怎么解决的?可以请教你一下吗?谢谢了,我的QQ:麻烦楼主指点一下,非常感谢!
&&&您需要以后才能回答,未注册用户请先。CXF interceptor拦截器如何获取客户端发送的body消息内容 - ITeye问答
请求各位大侠的帮助..
以下是我服务器端得拦截器我想通过context.getMessageContext()方法获取body信息可是总为null,不知道如何获取body中的消息内容,还有别的什么方法吗?
.bps.security.
import java.io.IOE
import javax.annotation.R
import javax.security.auth.callback.C
import javax.security.auth.callback.CallbackH
import javax.security.auth.callback.UnsupportedCallbackE
import javax.servlet.http.HttpServletR
import javax.xml.ws.WebServiceC
import javax.xml.ws.handler.MessageC
import org.apache.cxf.interceptor.F
import org.apache.cxf.message.M
import org.apache.cxf.transport.http.AbstractHTTPD
import org.apache.ws.security.WSPasswordC
public class WsAuthHandler& implements CallbackHandler{
//@Resource
//private WebServiceC
public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
this.setUsername(pc.getIdentifier());
this.setPassword(pc.getPassword());
System.out.println("identifier: " + pc.getIdentifier());
System.out.println("password: " + pc.getPassword());
System.out.println("usage: " + pc.getUsage());
&&&&&&&&&&&&&&&&& //我服务器端得拦截器我想通过context.getMessageContext()方法获取body信息可是总为null,
&&&&&&&&&&&&&&&&&&&& //不知道如何获取body中的消息内容,还有别的什么方法吗?
System.out.println(context.getMessageContext());
if (pc.getIdentifier().equals("yinfeifei")){
if (!pc.getPassword().equals("welcome1")) {
System.out.println("wrong password");
System.out.println("userinfosecurity validate successfully");
System.out.println("wrong username");
public String getUsername() {
public void setUsername(String username) {
this.username =
public String getPassword() {
public void setPassword(String password) {
this.password =
请求各位大侠的帮助..
以上是我服务器端得拦截器我想通过context.getMessageContext()方法获取body信息可是总为null,不知道如何获取body中的消息内容,还有别的什么方法吗?
[url]
http://blog.csdn.net/wangnetkang/article/details/7822570
[/url]
已解决问题
未解决问题模拟请求webservice并获取返回报文
有时需要模拟请求webservice服务,并处理返回的报文,根据报文的信息进行业务处理。
样例代码如下:
import java.io.ByteArrayOutputS
import java.
有时需要模拟请求webservice服务,并处理返回的报文,根据报文的信息进行业务处理。
样例代码如下:
import java.io.ByteArrayOutputS
import java.io.DataOutputS
import java.io.InputS
import java.io.UnsupportedEncodingE
import java.net.HttpURLC
import java.net.URL;
import java.util.HashMap;
import java.util.M
public class SimRequestWS {
public static Map&String,String& doRequestWS(URL url, String request) {
HttpURLConnection connection = null;
String rspMsg = "";
String rspCode = "ERROR";
byte[] requestBuf = (byte[]) null;
requestBuf = request.getBytes("gbk");
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setRequestProperty("Content-Type", "text/plain");
connection.connect();
DataOutputStream out = new DataOutputStream(
connection.getOutputStream());
out.write(requestBuf);
out.flush();
out.close();
if (connection.getResponseCode() != 200) {
System.out.println("ERROR: " + connection.getResponseMessage());
InputStream in = connection.getInputStream();
ByteArrayOutputStream bufOut = new ByteArrayOutputStream();
byte[] readBuf = new byte[100];
while (true) {
int ret = in.read(readBuf);
if (ret & 0)
bufOut.write(readBuf, 0, ret);
byte[] rspBuf = bufOut.toByteArray();
rspMsg = new String(rspBuf, "gbk");
rspCode = connection.getResponseMessage();
} catch (Exception e) {
e.printStackTrace();
connection = null;
Map&String,String& map = new HashMap&String,String&();
map.put("rspCode", rspCode);
map.put("rspMsg", rspMsg);
return map;
public static void main(String[] args) throws Exception,
UnsupportedEncodingException {
URL url = new URL("http://172.168.27.154:8081/cxfdemo?wsdl");
Map&String,String& map =SimRequestWS.doRequestWS(
"&soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ws=\"http://ws.com/\"&"
+ "&soapenv:Header/&"
+ "&soapenv:Body&"
+ "&catt:hello&"
+ "&arg0&李四&/arg0&"
+ "&/catt:hello&"
+ "&/soapenv:Body&"
+ "&/soapenv:Envelope&");
System.out.println(map);
模拟请求一个Webservice服务,返回信息如下:
{rspCode=OK, rspMsg=&soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"&&soap:Body&&ns2:helloResponse xmlns:ns2="/"&&return&hello 李四&/return&&/ns2:helloResponse&&/soap:Body&&/soap:Envelope&}
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
阿里云双11狂欢,不只是5折
Loading...}

我要回帖

更多关于 webservice soap wsdl 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信