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
时间: 2024-08-01 22:06:13

web service 自定义拦截器的相关文章

struts2自定义拦截器怎么进不去

问题描述 一个破拦截器搞了半天没发现哪里出问题了就是进不去自定义的拦截器里,下面贴代码:struts.xml<?xml version="1.0" encoding="utf-8" ?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dt

WebServices中使用cxf开发日志拦截器以及自定义拦截器

首先下载一个cxf实例,里面包含cxf的jar包.我下的是apache-cxf-2.5.9 1.为什么要设置拦截器? 为了在webservice请求过程中,能动态操作请求和响应数据, CXF设计了拦截器. 2.拦截器分类 1. 按所处的位置分:服务器端拦截器,客户端拦截器 2. 按消息的方向分:入拦截器,出拦截器 3. 按定义者分:系统拦截器,自定义拦截器 3.拦截器API Interceptor(拦截器接口) AbstractPhaseInterceptor(自定义拦截器从此继承) Loggi

SSH-Struts2简单的自定义拦截器MethodFilterInterceptor

SSH-Struts2简单的自定义拦截器MethodFilterInterceptor      最近业余时间工作之余也在学习SSH相关的知识,今天刚刚尝试写了一个基础的Struts2拦截器通过继承MethodFilterInterceptor方法.    一.什么是拦截器 拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式. 二.本文

cxf自定义拦截器怎么获取到传入参数值

问题描述 cxf自定义拦截器怎么获取到传入参数值 cxf自定义拦截器怎么获取传入参数值 或者怎么 把 Object obj = message.getContent(List.class).get(0); // 的值取出来 解决方案 http://www.tuicool.com/articles/fAZ3QnJ

struts-关于Struts自定义拦截器的问题

问题描述 关于Struts自定义拦截器的问题 Struts自定义拦截器里只能设置不拦截指定的方法或者只拦截指定的方法.如果我有两个Action(Action1,Action2)而里面的方法有相同方法名的方法(foo()),而我想拦截Action1的foo()方法,不想拦截Action2的foo()方法,该怎么做呢,能不能指定拦截器不拦截指定的Action呢?*_* 解决方案 运行逻辑是先运行拦截器再运行action,拦截器配置可作用于一个action下,两个action完全可以分开配置 解决方案

stauts 2 自定义拦截器

问题描述 我想定义一个拦截action中指定方法的拦截器,比如我只拦截add方法.我看到网上有人说extendsMethodFilterInterceptor可是我不知道怎么在stauts.xml中配置,请各位大牛帮帮忙啊 解决方案 解决方案二:去我BLOG看下有个自定义拦截器的例子http://blog.csdn.net/java_cxrs/archive/2010/04/23/5519743.aspx解决方案三:嗯继承自MethodFilterInterceptor抽象基类就可以对方法进行拦

关于Struts2文件上传与自定义拦截器_java

一.访问或添加request/session/application属性 public String scope() throws Exception{   ActionContext ctx = ActionContext.getContext();   ctx.getApplication().put("app", "应用范围");//往ServletContext里放入app   ctx.getSession().put("ses", &q

java自定义拦截器用法实例_java

本文实例讲述了java自定义拦截器及其用法.分享给大家供大家参考.具体如下: LoginInterceptor.java文件如下: package com.tq365.util; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwo

Struts2重新学习之自定义拦截器(判断用户是否是登录状态)

拦截器 一:1:概念:Interceptor拦截器类似于我们学习过的过滤器,是可以再action执行前后执行的代码.是web开发时,常用的技术.比如,权限控制,日志记录. 2:多个拦截器Interceptor连在一起组成了Interceptor栈.拦截器是AOP面向切面编程的一种实现,具有热插拔的效应. 3:Struts2拦截器,每个拦截器类只有一个对象实例,即采用了单利模式.所有引用这个拦截器的action都共享着一拦截器类的实例.   拦截器和过滤器的区别 1:拦截器和过滤器的概念非常类似