cxf整合spring配置拦截器

简介:

    文章 http://5148737.blog.51cto.com/5138737/1606499 介绍了如何将cxf与spring整合,本文将介绍如何添加拦截器,并使用权限校验的案例,来进行讲解。

    整个过程为:client端调用server端的wsdl之前,配置拦截器,先添加 权限等相关信息, 发送请求到server端, server端同样配置拦截器,校验权限信息是否正确,如果不正确,则打印异常信息。

    拦截器需要继承AbstractPhaseInterceptor 类。

(1)实现client端拦截器,添加权限信息(userId,userPass在spring配置文件中注入)

public class AddHeaderInteceptor extends AbstractPhaseInterceptor<SoapMessage>{
	private String userId;
	private String userPass;
	public AddHeaderInteceptor() {
		super(Phase.PREPARE_SEND);
	}

	@Override
	public void handleMessage(SoapMessage soapMessage) throws Fault {
		List<Header> headers = soapMessage.getHeaders();
		Document doc = DOMUtils.createDocument();
		Element userIdElement = doc.createElement("userId");
		Element userPassElement = doc.createElement("userPass");
		userIdElement.setTextContent(userId);
		userPassElement.setTextContent(userPass);
		Element authElement = doc.createElement("AuthHeader");
		authElement.appendChild(userIdElement);
		authElement.appendChild(userPassElement);
		QName qName = new QName("xiejun");
		SoapHeader soapHeader = new SoapHeader(qName, authElement);
		headers.add(soapHeader);
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserPass() {
		return userPass;
	}

	public void setUserPass(String userPass) {
		this.userPass = userPass;
	}
}

解释:首先获得了SoapMessage的header,为一个list,创建了一个AuthHeader元素,里面包含userId与userPass两个子元素,组装成SoapHeader,最后将SoapHeader添加到header list中


(2)客户端配置文件,配置该拦截器 

<!-- 注入相关权限信息 -->
<bean id="addHeaderInteceptor" class="com.xj.interceptor.AddHeaderInteceptor">
        <property name="userId" value="xiejun"/>    
        <property name="userPass" value="1234"/>
     </bean>
     
   <jaxws:client id="hello" serviceClass="com.xj.service.IHello" address="http://localhost/cxf/testHello?wsdl">
        <!--  <jaxws:inInterceptors>
              <ref bean="handlerMessage"/>
          </jaxws:inInterceptors>
         -->  
          <jaxws:outInterceptors>
              <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
              <ref bean="addHeaderInteceptor"/>
          </jaxws:outInterceptors>
   </jaxws:client>


如上所示,可以同时为in和out两个拦截器链 配置 拦截器,这里我们为out拦截器链配置,其一为cxf本身自带的日志拦截器,打印日志显示;其二为我们添加权限信息的拦截器。


至此为止,客户端配置结束


(3)实现server端拦截器,校验权限信息是否正确

public class CheckHeader extends AbstractPhaseInterceptor<SoapMessage>{

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

	@Override
	public void handleMessage(SoapMessage soapMessage) throws Fault {
		List<Header> headers = soapMessage.getHeaders();
		for(Header header:headers){
			SoapHeader soapHeader = (SoapHeader)header;
			Element element = (Element)soapHeader.getObject();
			if(element.getTagName().endsWith("AuthHeader")){
				NodeList userIdList = element.getElementsByTagName("userId");
				NodeList userPassList = element.getElementsByTagName("userPass");
				if(userIdList==null||userIdList.getLength()<1||userPassList==null||userPassList.getLength()<1){
					System.out.println("error2");
				}
				String username = userIdList.item(0).getTextContent();
				String password = userPassList.item(0).getTextContent();
				if(!username.equals("xiejun")||!password.equals("123456")){
					System.out.println("error3");
				}
				
			}else{
				System.out.println("error1");
			}
		}
	}
}

解释:拦截器中取出header信息,进行校验,不正确则打印异常信息,真实情况则可能是抛出异常。


(4)配置server端拦截器(与client配置相同)

<bean id="checkHeader" class="com.xj.interceptor.CheckHeader"/>
    
     <!-- <bean id="hello" class="com.xj.service.HelloImpl"/>  --> 
     <jaxws:endpoint id="testHello" implementor="com.xj.service.HelloImpl" address="/testHello" >
        <jaxws:inInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingInInterceptor"/>
            <ref bean="checkHeader"/>
        </jaxws:inInterceptors>
        <jaxws:outInterceptors>
            <bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"/>
        </jaxws:outInterceptors>
     </jaxws:endpoint>

这里将检验权限拦截器配置在in 拦截器链,因为在接收到请求之前,我们就要进行权限的验证。


启动该项目,发现如果用户名或密码不正确的话,则会打印错误信息。





     本文转自布拉君君 51CTO博客,原文链接:http://blog.51cto.com/5148737/1608236,如需转载请自行联系原作者



相关文章
|
20天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
36 4
|
17天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
28 0
|
10天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
2天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
|
18天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
103 1
|
23天前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
17 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
191 1
|
24天前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
38 0
|
24天前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
71 0
|
30天前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
34 0