webservice学习三之webservice的请求流程是什么

 

对于负责的数据类型,即自己定义的javabean,必须要有无参构造方法,当服务端传递的map时,客户端要用一个List<Entry>遍历map,例如

注意jdk不支持map的结构

最顶层有个拦截器的接口

写拦截器的代码:

package com.java_webservice.day01_ws.server;

import java.util.List;

import javax.xml.ws.Endpoint;

import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.message.Message;

import com.java_webservice.day01_ws.HelloWSImpl;

public class ServerTest3 {
	
	public static void main(String[] args) {
		String address = "http://127.0.0.1:8888/day01_ws/datatypews";
		Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
		System.out.println(endpoint);
		
		EndpointImpl endpointImpl = (EndpointImpl)endpoint;
		
		//服务端的日志入拦截器
		List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();
		inInterceptors.add(new LoggingInInterceptor()); //得到对应的拦截器
		
		//服务器端的日志出拦截器
		List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());
		System.out.println("发布成功");
	}

}

给客户端增加拦截器,拦截器是cxf框架的所以,需要导入jar包

package com.java_webservice.day01_ws.test;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import com.java_webservice.day01_ws.HelloWS;
import com.java_webservice.day01_ws.HelloWSImplService;

public class client {
	
	public static void main(String[] args) {
		HelloWSImplService facory = new HelloWSImplService();
		HelloWS hellows = facory.getHelloWSImplPort();
		Client client = ClientProxy.getClient(hellows);
		//获取出日志出拦截器
		List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());
		
		//获取客户端日志入拦截器
		List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
		inInterceptors.add(new LoggingInInterceptor());
		String result = hellows.sayHello("Bob");
		System.out.print("client"+ result);
	}

}

自定义拦截器,有的时候别人调用我们的webservice,我需要验证是否是合法的用户,我们要得调用的用户名和密码:

我们需要将代用户信息方法xml片段中

下面是cxf 客户端的一个拦截器,即自顶一个客户端输出的拦截器

package com.java_webservice.day01_ws.interceptor;

import java.util.List;

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

import com.sun.org.apache.xml.internal.utils.DOMHelper;


public class AddUserinterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	private String name;
	private String password;
	public AddUserinterceptor(String name, String password) {
		super(Phase.PRE_PROTOCOL);//准备协议化的时候进行拦截
		this.name = name;
		this.password = password;
	}

	/**
	 * 请求的内容都是html+xml的格式,我们需要将用户信息方法xml片段中
	 * 所以我们需要将信息中的头信息添加进去
	 * 根据以前拦截的信息,我们分析出xml标签片段有
	 * <Envelope>
	 * 		<Body>
	 * 			<sayHellow></sayHellow>
	 * 		</Body>
	 * </Envelope>
	 *
	 * 
	 */
	@Override
	public void handleMessage(SoapMessage msg) throws Fault {
		List<Header> headers = msg.getHeaders();
		Document createDocument = DOMHelper.createDocument();
		
		Element rootEle = createDocument.createElement("atguigu");
		
		//创建name标签,并且将name标签放到对应的
		Element nameEle = createDocument.createElement("name");
		nameEle.setTextContent(name);
		rootEle.appendChild(nameEle);
		//我们创建password标签
		Element padEle = createDocument.createElement("password");
		padEle.setTextContent(password);
		rootEle.appendChild(padEle);
		
		headers.add(new Header(new QName("atguigu"), rootEle));
		
		System.out.println("client handleMessage");
		
	}

}

客户端调用我们的拦截器器代码

package com.java_webservice.day01_ws.test;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.message.Message;

import com.java_webservice.day01_ws.HelloWS;
import com.java_webservice.day01_ws.HelloWSImplService;
import com.java_webservice.day01_ws.interceptor.AddUserinterceptor;

public class Testclient3 {
	
	public static void main(String[] args) {
		HelloWSImplService facory = new HelloWSImplService();
		HelloWS hellows = facory.getHelloWSImplPort();
		Client client = ClientProxy.getClient(hellows);
		//获取出日志出拦截器
		List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());
		
		//获取客户端日志入拦截器
		List<Interceptor<? extends Message>> inInterceptors = client.getInInterceptors();
		
		//将我们自定义的拦截器类放到 客户端的拦截器集合中
		outInterceptors.add(new AddUserinterceptor("abc", "123456"));  
		String result = hellows.sayHello("Bob");
		System.out.print("client"+ result);
	}

}

然后启动服务端你和客户端,我们发现服务端的拦截器 有我们自定义的片段

同理下面写一个服务端的输入拦截器

package com.java_webservice.day01_ws.interceptor;

import javax.xml.namespace.QName;

import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Element;

public class CheckInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	public CheckInterceptor() {
		super(Phase.PRE_PROTOCOL); //在协议化的时候传递
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		Header header = message.getHeader(new QName("atguigu"));
		if(header != null ) {
			Element atguiguEle = (Element)header.getObject();
			String name = atguiguEle.getElementsByTagName("name").item(0).getTextContent();
			String password = atguiguEle.getElementsByTagName("password").item(0).getTextContent();
			if("abc".equals(name) && "123456".equals(password)) {
				System.out.println("server 通过拦截器");
			}else {
				//不能通过,我们抛出一个一场,实际开发中不能这样做
				System.out.println("server 不通过");
				throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码"));
			}
		}
		
		
		
	}

}

修改服务端的代码

package com.java_webservice.day01_ws.server;

import java.util.List;

import javax.xml.ws.Endpoint;

import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.message.Message;

import com.java_webservice.day01_ws.HelloWSImpl;
import com.java_webservice.day01_ws.interceptor.CheckInterceptor;

public class ServerTest3 {
	
	public static void main(String[] args) {
		String address = "http://127.0.0.1:8888/day01_ws/datatypews";
		Endpoint endpoint = Endpoint.publish(address, new HelloWSImpl());
		System.out.println(endpoint);
		
		EndpointImpl endpointImpl = (EndpointImpl)endpoint;
		
		//服务端的日志入拦截器
		List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();
		inInterceptors.add(new CheckInterceptor()); //得到对应的拦截器
		
		//服务器端的日志出拦截器
		List<Interceptor<? extends Message>> outInterceptors = endpointImpl.getOutInterceptors();
		outInterceptors.add(new LoggingOutInterceptor());
		System.out.println("发布成功");
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值