CXF自定义拦截器的使用

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010741376/article/details/48215041

首先,我们先准备好终端的接口和实现类

package com.webservice.ws;

import javax.jws.WebMethod;
import javax.jws.WebService;

@WebService
public interface HelloWS {
	
	    @WebMethod
        public String sayHello(String name);
}


实现类:

  

package com.webservice.ws;

import javax.jws.WebService;

@WebService
public class HelloWSImple implements HelloWS {

	@Override
	public String sayHello(String name) {
		System.out.println("终端接口实现");
		return "Hello,"+name;
	}

}

终端写完后,我们开始写服务器拦截器的代码,我们通过一个用户名和密码进行校验:

package com.webservice.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;


/**
 * 服务器端拦截器进行校验
 * @author yxs
 *
 */
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("Student"));
		  if(header!=null){
			  Element Student=(Element)header.getObject();
			  String name=Student.getElementsByTagName("name").item(0).getTextContent();
			  String password=Student.getElementsByTagName("password").item(0).getTextContent();
			  if("scott".equals(name)&&"123456".equals(password)){
				  System.out.println("服务器端拦截器通过....");
				  return;
			  }
			  
			  
		  }
		  System.out.println("服务器端拦截器没有通过....");
		  throw new Fault(new RuntimeException("请求需要一个正确的用户名和密码!"));
		
	}

}

然后我们开始发布服务器端的代码:

package com.webservice.server;

import java.util.List;

import javax.xml.ws.Endpoint;

import org.apache.cxf.interceptor.Interceptor;
import org.apache.cxf.jaxws22.EndpointImpl;
import org.apache.cxf.message.Message;

import com.webservice.interceptor.CheckUserInterceptor;
import com.webservice.ws.HelloWSImple;

public class WbTest {
      public static void main(String[] args) {
		String address="http://localhost:8080/WebserviceDemo/helloWorld";
    	  Endpoint endpoint = Endpoint.publish(address, new HelloWSImple());
    	  System.out.println(endpoint);
    	  EndpointImpl endpointImpl=(EndpointImpl)endpoint;
    	  
    	  List<Interceptor<? extends Message>> inInterceptors = endpointImpl.getInInterceptors();
    	  inInterceptors.add(new CheckUserInterceptor());
    	  
    	  
    	  System.out.println("发布webservice成功");
	}
}


接下来,我们需要通过cxf的wsdl2java生成客户端代码:


客户端代码生成后,我们就开始写客户端拦截器了:

package com.webservice.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.apache.xml.utils.DOMHelper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * 客户端拦截器
 * @author yxs
 *
 */
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;
	}

	/*
 	<Envelope>
 		<head>
 			<Student>
 				<name>scott</name>
 				<password>123456</password>
 			</Student>
 			<Student>
 				<name>scott</name>
 				<password>123456</password>
 			</Student>
 		<head>
 		<Body>
 			<sayHello>
 				<arg0>scott</arg0>
 			<sayHello>
 		</Body>
 	</Envelope>
 */
	@SuppressWarnings("deprecation")
	public void handleMessage(SoapMessage msg) throws Fault {
		List<Header> headers = msg.getHeaders();
		/**
		 * <Student>
 				<name>scott</name>
 				<password>123456</password>
 			</Student>
		 */
		Document docuemnt= DOMHelper.createDocument();
		Element rootEle = docuemnt.createElement("Student");
		Element nameEle= docuemnt.createElement("name");
		nameEle.setTextContent(name);
		rootEle.appendChild(nameEle);
		
		Element passwordEle= docuemnt.createElement("password");
		passwordEle.setTextContent(password);
		rootEle.appendChild(passwordEle);
		
		headers.add(new Header(new QName("Student"), rootEle));
		System.out.println("客户端拦截器............");
		
	}

}

拦截器写完后,我就开始写客户端的调用代码了:

package com.webservice.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.message.Message;

import com.webservice.ws.HelloWS;
import com.webservice.ws.HelloWSImpleService;
import com.webservice.ws.interceptor.AddUserInterceptor;

public class ClientTest {
         public static void main(String[] args) {
	         HelloWSImpleService factory=new HelloWSImpleService();
		 HelloWS helloWSImplePort = factory.getHelloWSImplePort();
        	 Client client = ClientProxy.getClient(helloWSImplePort);
        	 List<Interceptor<? extends Message>> outInterceptors = client.getOutInterceptors();
        	 outInterceptors.add(new AddUserInterceptor("scott","123456"));
        	 String info=helloWSImplePort.sayHello("mike");
        	 System.out.println("client:"+info);
		     
        	 System.out.println("client===================");
        	 
		}
}

ok,大功告成。




相关文章
|
人工智能 自然语言处理 API
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
图片转音乐模型来了!Image to Music V2 :只需上传一张照片,自动转换成与图片内容匹配的音频!
911 1
|
Linux Perl
Linux 系统快速分析日志定位故障原因的 10 个方法
在 Linux 系统中,日志是一种非常重要的资源。系统管理员可以通过日志记录的内容来检测系统的运行状况,分析问题,做出相应的调整和优化。由于日志文件数量庞大,内容复杂,因此需要使用一些工具和技术帮助管理员进行快速分析和查找。 本文将介绍 Linux 系统中快速分析日志、定位故障的 10 个方法。
3951 1
|
算法 Java 测试技术
SpringBoot@Profile详解
SpringBoot@Profile详解
713 0
xxljob在业务代码中添加任务(登录后token验证)
之前做过一次在业务代码中调用xxljob的接口添加任务启动任务,xxljob的接口添加免登录验证注解后直接调用,博文地址:xxl-job 在业务代码中添加任务,后面用到的groupId获取方法也在这里面。
|
前端开发 API 微服务
SpringCloud微服务之间使用Feign调用不通情况举例
SpringCloud微服务之间使用Feign调用不通情况举例
1755 2
|
监控 机器人 Java
【python】调用钉钉机器人发起通知
【python】调用钉钉机器人发起通知
306 0
|
druid Java 关系型数据库
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
在Spring Boot中集成Druid实现多数据源有两种常用的方式:使用Spring Boot的自动配置和手动配置。
3184 5
|
druid
druid连接池泄露
druid连接池泄露
353 0
|
人工智能 开发者
左右侧检验与双侧检验 | 学习笔记
快速学习左右侧检验与双侧检验
左右侧检验与双侧检验 | 学习笔记
|
存储 缓存 druid
基于springboot+jpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源
基于springboot+jpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源
4286 0
基于springboot+jpa 实现多租户动态切换多数据源 - 基于dynamic-datasource实现多租户动态切换数据源