web service 自定义拦截器

简介:

客户端拦截器:

package com.xh.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.helpers.DOMUtils;
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;



public class LoginInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

	private String name;
	private String password;
	
	
	public LoginInterceptor() {
		super(Phase.PRE_PROTOCOL);
	}
	
	public LoginInterceptor(String name,String password) {
		super(Phase.PRE_PROTOCOL);
		this.name=name;
		this.password=password;
	
	}

	@Override
	public void handleMessage(SoapMessage arg0) throws Fault {
		/**
		 * 客户端的head
		 * <user>
		 * 		<name>zhangsan</name>
		 * 		<password>zhangsan</password>
		 * </user>
		 * 	
		 */
			List<Header> heads=arg0.getHeaders();
			
			Document document=DOMUtils.createDocument();
			Element rootEle=document.createElement("user");
			Element nameEle=document.createElement("name");
			nameEle.setTextContent(name);
			Element passwordEle=document.createElement("password");
			passwordEle.setTextContent(password);
			rootEle.appendChild(nameEle);
			rootEle.appendChild(passwordEle);
			heads.add(new Header(new QName("user"), rootEle));
			System.out.println("Client:handleMessage().....");
			
	}

}

客户端测试代码:

package com.xh.ws.test;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.interceptor.LoggingOutInterceptor;

import com.xh.ws.interceptor.LoginInterceptor;
import com.xh.ws.sei.SayHello;
import com.xh.ws.sei.SayHelloImplService;

public class ClientTest {

	public static void main(String[] args) {
		SayHelloImplService factory=new SayHelloImplService();
		SayHello hello=factory.getSayHelloImplPort();
		Client client=ClientProxy.getClient(hello);
		//添加自定义拦截器
		client.getOutInterceptors().add(new LoginInterceptor("zhangsan","123456"));
		//添加日志拦截器
		client.getOutInterceptors().add(new LoggingOutInterceptor());
		System.out.println(hello.sayHello("lili"));
	}
}

服务端拦截器:

package com.xh.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 LoginInterceptor extends AbstractPhaseInterceptor<SoapMessage>{

	public LoginInterceptor() {
		super(Phase.PRE_INVOKE);
	}

	@Override
	public void handleMessage(SoapMessage arg0) throws Fault {
		
		Header header=arg0.getHeader(new QName("user"));
		if(header!=null)
		{
			/**
			 * 解析header
			 */
			Element rootEle=(Element) header.getObject();
			Element name=(Element) rootEle.getElementsByTagName("name").item(0);
			Element password=(Element) rootEle.getElementsByTagName("password").item(0);
			String name_1=name.getTextContent();
			String password_1=password.getTextContent();
			
			if("zhangsan".equals(name_1)&&"123456".equals(password_1))
			{
				return;
			}else
			{
				throw new RuntimeException("用户名或密码不正确!");
			}
			
			
			
		}
		
	}

}

服务端测试代码:

package com.xh.ws.test;

import javax.xml.ws.Endpoint;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.jaxws.EndpointImpl;

import com.xh.ws.interceptor.LoginInterceptor;
import com.xh.ws.sei.SayHelloImpl;

public class ServerTest {

	public static void main(String[] args) {
		Endpoint endpoint=Endpoint.publish("http://127.0.0.1:54321", new SayHelloImpl());
		EndpointImpl endpointImpl=(EndpointImpl) endpoint;
		//添加自定义拦截器
		endpointImpl.getInInterceptors().add(new LoginInterceptor());
		//添加日志拦截器
		endpointImpl.getInInterceptors().add(new LoggingInInterceptor());
		System.out.println("发布成功");
	}
}


结果:

当正确时:

Client:handleMessage().....
三月 01, 2016 4:14:11 下午 org.apache.cxf.services.SayHelloImplService.SayHelloImplPort.SayHello
信息: Outbound Message
---------------------------
ID: 1
Address: http://127.0.0.1:54321/
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><user><name>zhangsan</name><password>123456</password></user></soap:Header><soap:Body><ns2:sayHello xmlns:ns2="http://sei.ws.xh.com/"><arg0>lili</arg0></ns2:sayHello></soap:Body></soap:Envelope>
--------------------------------------
lili

错误时:

Client:handleMessage().....
三月 01, 2016 4:37:17 下午 org.apache.cxf.services.SayHelloImplService.SayHelloImplPort.SayHello
信息: Outbound Message
---------------------------
ID: 1
Address: http://127.0.0.1:54321/
Encoding: UTF-8
Http-Method: POST
Content-Type: text/xml
Headers: {Accept=[*/*], SOAPAction=[""]}
Payload: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Header><user><name>zhangsan</name><password>1234561</password></user></soap:Header><soap:Body><ns2:sayHello xmlns:ns2="http://sei.ws.xh.com/"><arg0>lili</arg0></ns2:sayHello></soap:Body></soap:Envelope>
--------------------------------------
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: 用户名或密码不正确!
	at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
	at com.sun.proxy.$Proxy34.sayHello(Unknown Source)
	at com.xh.ws.test.ClientTest.main(ClientTest.java:21)
Caused by: org.apache.cxf.binding.soap.SoapFault: 用户名或密码不正确!


相关参考资料:

http://huiseyiyu.iteye.com/blog/1172160




目录
相关文章
|
3月前
|
安全 前端开发 API
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
|
3月前
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
【Azure 应用服务】Web App Service 中的 应用程序配置(Application Setting) 怎么获取key vault中的值
|
1天前
【Azure App Service】PowerShell脚本批量添加IP地址到Web App允许访问IP列表中
Web App取消公网访问后,只允许特定IP能访问Web App。需要写一下段PowerShell脚本,批量添加IP到Web App的允许访问IP列表里!
|
3天前
|
前端开发 开发者
WEB自定义页面请求响应
Web组件支持在应用拦截到页面请求后自定义响应请求能力。开发者通过onInterceptRequest()接口来实现自定义资源请求响应 。自定义请求能力可以用于开发者自定义Web页面响应、自定义文件资源响应等场景。
|
3月前
|
关系型数据库 MySQL Linux
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
【Azure 应用服务】在创建Web App Service的时候,选Linux系统后无法使用Mysql in App
|
3月前
|
JavaScript PHP 开发者
PHP中的异常处理与自定义错误处理器构建高效Web应用:Node.js与Express框架实战指南
【8月更文挑战第27天】在PHP编程世界中,异常处理和错误管理是代码健壮性的关键。本文将深入探讨PHP的异常处理机制,并指导你如何创建自定义错误处理器,以便优雅地管理运行时错误。我们将一起学习如何使用try-catch块捕获异常,以及如何通过set_error_handler函数定制错误响应。准备好让你的代码变得更加可靠,同时提供更友好的错误信息给最终用户。
|
3月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
3月前
|
Linux 应用服务中间件 网络安全
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?
|
3月前
【Azure 应用服务】通过 Web.config 开启 dotnet 应用的 stdoutLog 日志,查看App Service 产生500错误的原因
【Azure 应用服务】通过 Web.config 开启 dotnet 应用的 stdoutLog 日志,查看App Service 产生500错误的原因
|
3月前
|
Linux Python
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https
【Azure 应用服务】Azure App Service For Linux 上实现 Python Flask Web Socket 项目 Http/Https