`
dycsos123ok
  • 浏览: 82821 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

*****cxf之Filter问题*****

阅读更多

说明:过滤器使用范围还是挺广泛的,比如webservice中的安全认证、数字签名、Token认证都可以使用过滤器来做;下面纯粹是一个小例子,以方便后期使用时查询,仅供参考。以服务端和客户端两部分介绍(所需要包自己导入):

 

服务端

一、定义接口

import javax.jws.WebService;
@WebService
public interface HelloWorld {
	public String sayHello(String inputXML);
}

 

 二、定义实现类

@WebService(endpointInterface = "com.dyc.dao.HelloWorld")
public class HelloWorldImpl implements HelloWorld {
	@WebMethod
	public String sayHello(@WebParam(name = "inputXML") String inputXML) {
		// TODO Auto-generated method stub
		String name = ParseXml.parseElement(inputXML, "name");
		System.out.println("Server接收到输入参数为-->" + name);
		return "How are you ?-->" + name;
	}
}

 

三、XML解析类(dom4j,请自导入包)

public class ParseXml {

	public static String parseElement(String inputXML, String objStr) {
		InputStream in = null;
		String str = null;
		Element rootElement = null;
		try {
			in = new ByteArrayInputStream(inputXML.getBytes("UTF-8"));
			SAXReader reader = new SAXReader();
			Document document = reader.read(in); // 把流转成document对象。
			rootElement = document.getRootElement();
			Element tokenNode = rootElement.element(objStr);
			if (tokenNode != null) {
				str = tokenNode.getTextTrim();
			}
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		return str;

	}
}

 

四、过滤器

public class TokenInFilter extends AbstractPhaseInterceptor<SoapMessage> {
	public TokenInFilter(String phase) {
		super(Phase.PRE_INVOKE);
	}

	public void handleMessage(SoapMessage message) throws Fault {

		// 获取SOAP消息的全部头
		List<Header> headers = message.getHeaders();
		
		if (null == headers || headers.size() < 1) {
			throw new Fault(new SOAPException("SOAP消息头格式不对哦!"));
		}
		try{
			for (Header header : headers) {
				SoapHeader soapHeader = (SoapHeader) header;
				// 取出SOAP的Header元素
				/*解析soap的头信息*/
				Element element = (Element) soapHeader.getObject();
				XMLUtils.printDOM(element);
				NodeList tokenList = element
						.getElementsByTagName("tns:token");
				/*NodeList nameList = element
						.getElementsByTagName("tns:name");
				NodeList passList = element
						.getElementsByTagName("tns:pass");*/
					
				String token = tokenList.item(0).getTextContent();
				System.out.println("Token------>"+token);
				//在此验证Token的合法性
			/*	System.out.println(nameList.item(0).getTextContent());
				System.out.println(passList.item(0).getTextContent());*/
			}
		}catch(Exception e){
			throw new Fault(new SOAPException("解析Soap信息出错!"));
		}

	}

}

 

五、XML配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>WEB-INF/beans_*.xml</param-value>
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<display-name>cxf</display-name>
	<servlet>
		<servlet-name>cxf</servlet-name>
		<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>cxf</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

	<session-config>
		<session-timeout>60</session-timeout>
	</session-config>

</web-app>

 

六、bean_1.xml:用来发布服务的配置

<import resource="classpath:META-INF/cxf/cxf.xml" />
	<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
	<!-- 自定义拦截器 -->
	<bean id="authIntercetpr" class="com.dyc.filter.TokenInFilter">
		<constructor-arg value="receive" />
	</bean>


	<jaxws:endpoint id="helloWorld"
		implementor="com.dyc.impl.HelloWorldImpl" address="/HelloWorld">
		 <jaxws:inInterceptors> <!-- 进入webservice之前的拦截器 -->
			<ref bean="authIntercetpr" />
		</jaxws:inInterceptors> 
	</jaxws:endpoint>

 

 

 

 

客户端

 

一、利用wsdl2java生成客户端代码(省略,代码太多了)

例:wsdl2java -p com.dyc.client -d d:/ws -verbose http://localhost:6888/webgisplatform/BaseService?wsdl

 

二、将生成的代码导入一个工程,可以建任意一个java工程

 

三、生成AddSoapHeader,模拟生成一个soap的头信息

public class AddSoapHeader extends AbstractSoapInterceptor {

	private static String nameURI="http://localhost:8080/cxf_filter/HelloWorld";   
    
    public AddSoapHeader(){   
        super(Phase.WRITE);   
    }  
    public void handleMessage(SoapMessage message) throws Fault {   
        String token="12345678956789123344444";   
           
        QName qname=new QName("RequestSOAPHeader");   
        Document doc=DOMUtils.createDocument();   
        //自定义节点
        Element spId=doc.createElement("tns:token");   
        spId.setTextContent(token);   
        
        Element username=doc.createElement("tns:name");   
        username.setTextContent("gary"); 
        
        Element password=doc.createElement("tns:pass");   
        password.setTextContent("123456"); 
           
        Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader");   
        root.appendChild(spId);   
        root.appendChild(username);   
        root.appendChild(password);   
           
        SoapHeader head=new SoapHeader(qname,root);   
        List<Header> headers=message.getHeaders();   
        headers.add(head);   
        System.out.println(">>>>>添加header<<<<<<<");     
       
    }   

}

 

四、写一个调试入口main方法

public void testSend() {
		try {
			JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

			List<Interceptor<? extends Message>> list = new ArrayList<Interceptor<? extends Message>>();
			// 添加soap header
			list.add(new AddSoapHeader());
			// 添加soap消息日志打印
			list.add(new org.apache.cxf.interceptor.LoggingOutInterceptor());
			factory.setOutInterceptors(list);
			factory.setServiceClass(HelloWorld.class);
			factory
					.setAddress("http://localhost:8080/cxf_filter/HelloWorld");

			Object obj = factory.create();
			System.out.println(obj == null ? "NULL" : obj.getClass().getName());
			if (obj != null) {
				HelloWorld ws = (HelloWorld) obj;
				String name = Dom4jDemo.createDocument("");
				System.out.println(name);
				// 1、获取连接
				String str = ws.sayHello(name) ;
				System.out.println("res--->" + str);
			}
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public static void main(String[] args) {
		Test tc = new Test();
		tc.testSend();
	}

 

 

OK!发布好服务端,启动服务,可以测试了!

 

 

 

 

分享到:
评论
1 楼 wangyudong 2017-11-27  
由CXF实现的微服务需要有比较好的工具去测试RESTful API,很多REST Client是不支持自动化测试RESTful API,也不支持自动生成API文档.
之前习惯用一款名字为 WisdomTool REST Client,支持自动化测试RESTful API,输出精美的测试报告,并且自动生成精美的RESTful API文档。
轻量级的工具,功能却很精悍哦!

https://github.com/wisdomtool/rest-client

Most of REST Client tools do not support automated testing.

Once used a tool called WisdomTool REST Client supports automated testing, output exquisite report, and automatically generating RESTful API document.

Lightweight tool with very powerful features!

https://github.com/wisdomtool/rest-client

相关推荐

    CXF Web Server 教程

    拦截器类似于Servlet的Filter,可以在消息处理流程的各个阶段进行扩展。拦截器非线程安全,不应在其中定义实例变量,也不应直接调用下一个拦截器的方法,而是让InterceptorChain自动执行。 3. **前端(Front End)*...

    java cxf webservice接口解决跨域问题

    总结起来,解决Java CXF Webservice接口的跨域问题,需要利用CORS机制,配置CORS Filter,可能涉及`java-property-utils-1.9.jar`库,以及在`web.xml`中设置相应的初始化参数。同时,如果项目使用Spring框架,还可以...

    基于CXF框架的webservice的demo

    - 在web.xml中配置CXF的Servlet或Filter,指定服务的发布地址和服务类。 - 通过Spring集成,可以更灵活地配置服务端点和服务行为。 4. **测试与调用** - CXF提供了客户端API,可以方便地生成客户端代理类,调用...

    Apache CXF 快速上手教程.docx

    2. **消息传递和拦截器**:拦截器是CXF的关键组件,类似于Servlet的Filter。它们在消息传递过程中起到处理和错误处理的作用。拦截器有handleMessage和handleFault两个主要方法。开发者应避免在拦截器中定义实例变量...

    CXF3.0 demo

    4. **CXF的web.xml**:在Web应用的部署描述符中,会配置CXF的Servlet或Filter,它们处理HTTP请求并调用相应的服务实现。 5. **测试代码**:可能包括JUnit或其他测试框架的测试类,用于验证Web服务的正确性。 通过...

    CXF 入门示例

    拦截器类似于Servlet的Filter,可以拦截和处理消息流。拦截器链管理消息的传递顺序,handleMessage处理正常消息,handleFault处理错误。开发拦截器时,注意它们不是线程安全的,不应在拦截器中使用实例变量,且不应...

    cxf2.5.1+teamserver8.5.1组合jar包

    5. **集成与部署**:将CXF与TeamServer整合,通常涉及到修改TeamServer的配置文件(如web.xml),以便加载CXF的Servlet和Filter。此外,可能还需要编写Java代码来实现具体的Web服务接口,并将其部署在TeamServer上。...

    cxf+spring+web

    3. **Web配置文件(web.xml)**: Web应用的部署描述符,定义了应用的初始化参数,Servlet和Filter配置等。 4. **pom.xml** (如果使用Maven): Maven项目对象模型文件,包含了项目的依赖管理和构建指令。 5. **lib目录...

    apache cxf 教程

    - **拦截器**:在 CXF 中,拦截器类似于 JSP/Servlet 中的 Filter,用于在消息传递的过程中执行特定逻辑,如日志记录、安全验证等。拦截器的主要方法有 `handleMessage` 和 `handleFault`,分别用于处理正常消息和...

    CXF WebService 开发指南、技术文档

    CXF支持使用Interceptor来扩展服务行为,类似于Servlet中的Filter。Interceptor可以用来处理请求和响应消息的预处理和后处理操作。 1. **定义Interceptor**: - 继承`AbstractPhaseInterceptor`。 - 实现`...

    利用spring security 给cxf的业务方法添加保护

    Spring Security的核心组件包括Authentication(认证)、Authorization(授权)和Filter Chain(过滤器链)。在Web应用中,它会通过一系列预定义的过滤器处理HTTP请求,这些过滤器负责登录验证、权限检查等任务。 ...

    maven+spring+cxf webservice demo

    5. **webapp**:如果是Web应用,这里会包含Web相关的资源,如Web-INF下的web.xml,用于配置Servlet和Filter。 6. **cxf-servlet.xml**:Spring与CXF集成的配置文件,定义了CXF的前端控制器和服务 beans。 7. **pom....

    CXF_WebService_开发指南、技术文档

    Interceptor类似于Filter,可以在请求到达服务之前或者响应发送之前执行特定的操作,比如记录日志、验证用户身份等。 **客户端添加Interceptor**: ```java import org.apache.cxf.frontend....

    spring4+mybatis3+webservice+cxf框架整合

    其次,MyBatis 3是一个优秀的持久层框架,它解决了Java开发中的数据访问问题。MyBatis允许开发者将SQL语句直接写在XML配置文件或注解中,使得数据库操作更加直观,降低了DAO层的复杂性。它还支持动态SQL,可以根据...

    通过CXF开发webService接口(soap协议、maven项目).pdf

    Apache CXF是一个开源框架,专门用于构建和部署SOAP和RESTful Web服务。本教程将介绍如何利用CXF和Maven来创建一个基于SOAP协议的Web Service接口。 首先,为了使用CXF开发Web服务,我们需要在项目的pom.xml文件中...

    cxf和对Interceptor的支持和传递复杂对象的小例子

    这里的Interceptor就和Filter、Struts的Interceptor很类似,提供它的主要作用就是为了很好的降低代码的耦合性,提供代码的内聚性。以HelloWorldService为例子。 参照网址:...

    基于Flex三种通讯方式的Java配置与整合.docx

    &lt;filter-class&gt;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt; &lt;param-name&gt;singleSession &lt;param-value&gt;true &lt;/filter&gt; ``` 通过以上配置,我们可以实现基于Flex的...

    camel-manual-2.0

    - **Filter**: Selects messages based on criteria. - **Message Patterns**: - **Content-Based Router**: Decides the destination of a message based on its content. - **Message Translator**: Translates...

Global site tag (gtag.js) - Google Analytics