WebService学习笔记-CXF添加自定义拦截器

使用自定义拦截器实现用户名和密码的校验

客户端:出拦截器

服务器:入拦截器

客户端

AddUserInterceptor.java

package com.demo.interceptors;

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.apache.xml.utils.DOMHelper;//使用xalan-2.7.1.jar
import org.w3c.dom.Document;
import org.w3c.dom.Element;

public class AddUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
	private String username;
	private String password;

	public AddUserInterceptor(String username, String password) {
		super(Phase.PRE_PROTOCOL);// 准备协议化时拦截
		this.username = username;
		this.password = password;
	}

	/*
	 * 消息格式
	  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
		  <soap:Header>
			  <atguigu>
				  <username>umgsai</username>
				  <password>123456</password>
			  </atguigu>
		  </soap:Header>
		  <soap:Body>
			  <ns1:sayHi xmlns:ns1="http://demo.com/">
			  	<text>test~~~</text>
			  </ns1:sayHi>
		  </soap:Body>
	  </soap:Envelope>
	 * 
	 * */

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		List<Header> headers = message.getHeaders();
		Document document = DOMHelper.createDocument();
		Element rootElement = document.createElement("atguigu");
		Element usernameElement = document.createElement("username");
		usernameElement.setTextContent(username);
		rootElement.appendChild(usernameElement);
		Element passwordElement = document.createElement("password");
		passwordElement.setTextContent(password);
		rootElement.appendChild(passwordElement);
		headers.add(new Header(new QName("atguigu"), rootElement));
		System.out.println("拦截...");
	}

}

InterceptorHelloWorldClient.java  客户端添加拦截器

package com.demo;

import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;

import com.demo.HelloWorld;
import com.demo.User;
import com.demo.interceptors.AddUserInterceptor;

//http://blog.csdn.net/fhd001/article/details/5778915
public class InterceptorHelloWorldClient {
	public static void main(String[] args) {
		JaxWsProxyFactoryBean svr = new JaxWsProxyFactoryBean();
		svr.setServiceClass(HelloWorld.class);
		svr.setAddress("http://localhost:8080/helloWorld");
		HelloWorld hw = (HelloWorld) svr.create();

		// jaxws API 转到 cxf API 添加日志拦截器
		org.apache.cxf.endpoint.Client client = org.apache.cxf.frontend.ClientProxy
				.getClient(hw);
		org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint();
		//添加日志拦截器
		cxfEndpoint.getOutInterceptors().add(new LoggingOutInterceptor());
		//添加自定义的拦截器
		cxfEndpoint.getOutInterceptors().add(new AddUserInterceptor("umgsai", "123456"));

		User user = new User();
		user.setUsername("Umgsai");
		user.setDescription("test");
		System.out.println(hw.sayHiToUser(user));
		//String sayHi = hw.sayHi("test~~~");
		//System.out.println(sayHi);
	}
}


服务器端

CheckUserInterceptor.java 拦截器

package com.demo.interceptors;

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 CheckUserInterceptor extends AbstractPhaseInterceptor<SoapMessage> {

	public CheckUserInterceptor() {
		super(Phase.PRE_PROTOCOL);// 准备协议化时拦截
	}

	@Override
	public void handleMessage(SoapMessage message) throws Fault {
		Header header = message.getHeader(new QName("atguigu"));
		if (header != null) {
			Element element = (Element) header.getObject();
			String username = element.getElementsByTagName("username").item(0).getTextContent();
			String password = element.getElementsByTagName("password").item(0).getTextContent();
			if (username.equals("umgsai")&&password.equals("123456")) {
				System.out.println("通过拦截器...");
				return;
			}
		}
		//不能通过
		System.out.println("没有通过拦截器");
		throw new Fault(new RuntimeException("用户名或密码不正确"));
	}

}

InterceptorServerApp.java 将服务器端拦截器添加到服务端

package com.demo;

import javax.xml.ws.Endpoint;
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;

import com.demo.interceptors.CheckUserInterceptor;

public class InterceptorServerApp {
	public static void main(String[] args) {
		System.out.println("Starting web service... ");
		HelloWorldImpl implementor = new HelloWorldImpl();
		String address = "http://localhost:8080/helloWorld";
		Endpoint endpoint = Endpoint.publish(address, implementor);

		// jaxws API 转到 cxf API 添加日志拦截器
		EndpointImpl jaxwsEndpointImpl = (EndpointImpl) endpoint;
		org.apache.cxf.endpoint.Server server = jaxwsEndpointImpl.getServer();
		org.apache.cxf.endpoint.Endpoint cxfEndpoint = server.getEndpoint();
                //添加日志拦截器
		LoggingInInterceptor logging = new LoggingInInterceptor();
		cxfEndpoint.getInInterceptors().add(logging);
		//添加自定义拦截器
		cxfEndpoint.getInInterceptors().add(new CheckUserInterceptor());
		System.out.println("Web service started");
	}
}

参考尚硅谷教程

时间: 2024-10-18 16:55:17

WebService学习笔记-CXF添加自定义拦截器的相关文章

WebService学习笔记-CXF添加拦截器

Webservice拦截器:在webservice请求过程中,动态操作请求和响应的数据 分类 按照所处的位置分:服务器端拦截器  客户端拦截器 按照消息的方向分:入拦截器  出拦截器 按照定义者分:系统拦截器 自定义拦截器 在服务器端添加拦截器 package com.demo; //注意引入的类一定要正确 import javax.xml.ws.Endpoint; import org.apache.cxf.interceptor.LoggingInInterceptor; import or

【Struts2学习笔记-6--】Struts2之拦截器

简单拦截器的使用 拦截器最基本的使用: 拦截方法的拦截器 拦截器的执行顺序 拦截结果的监听器-相当于 后拦截器 执行顺序: 覆盖拦截器栈里特定拦截器的参数 使用拦截器完成-权限控制 主要完成两个功能: 先检查浏览者是否登录: 看登录的用户是否有权限访问: 来自为知笔记(Wiz) 附件列表

SpringMVC 学习笔记(九) 自定义拦截器

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Spring MVC</span><span style="font-family: 宋体; background-color: rgb(255, 255, 255);">也可以使用拦截器对请求进行拦截处理,用户 可以自定义拦截器来实现特定的功

struts2框架学习笔记6:拦截器

拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; //拦截器的第一种创建方式 //拦截器的生命周期:随项目启动创建,随项目关闭而销毁 public class MyInterceptor implements Intercepto

WebService学习笔记-CXF支持的数据类型

此实例测试CXF支持的数据类型 Student.java实体类 public class Student { private int id; private String name; private float price; //...省略getter setter方法 public Student() {//无参构造方法 super(); } } DataTypeWS.java接口 @WebService public interface DataTypeWS { @WebMethod pub

CXF 自定义拦截器

------要想添加一个拦截器,目的是调用之前做一个认证,也就是说不是所有的请求都能调用,这样就可以验证了,更安全. 1     在服务端写一个拦截器,public class MyInterceptor extends AbstractPhaseInterceptor<SoapMessage>  ,要给一个构造方法(可以确定是什么时候执行这个拦截器,Phase.PRE_INVOKE就是调用之前执行),重写handleMessage方法,因为信息在请求头里面,所以这个方法中有一些解析XML的A

cxf添加拦截器应用

项目中有时候也会做一些类似于权限验证的东西,拦截器也是一种实现方式.拦截器主要作用是做一些权限过滤,编码处理等. webService接口也可以上拦截器,我们也可以给webservice请求加权限判断功能: webservice分服务端和客户端,服务端和客户端都是可以加拦截器的,无论是服务端还是客户端,都分进,出(In,Out)拦截器: 可以使用cxf内置拦截器,也可以自定义拦截器,无论是自定义的拦截器,还是CXF自带的拦截器,都必须实现Interceptor接口. 下面分别从这两个方面来讲解:

WebService学习笔记汇总

鲁春利的工作笔记,谁说程序员不能有文艺范? WebService学习笔记(一)基础入门 http://luchunli.blog.51cto.com/2368057/1722944 WebService学习笔记(二)WDSL格式 http://luchunli.blog.51cto.com/2368057/1724887

nBodyCS&lt;I&gt;学习笔记之计算着色器

nBodyCS<I>学习笔记之计算着色器 Nvidia-SDK(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. DirectX一直是Windows上图形和游戏开发的核心技术.DirectX提供了一种在显卡上运行的程序--着色器(Shader).从DirectX11开始,DirectX增加了一种计算着色器(Compute Shader),它是专门为与图形无关的通用计算设计的.因此DirectX就变成了一个通用GPU计算的平台.鉴于GPU拥有极其强大的并行运算能力,学习使用Direct